diff --git a/_config.yml b/_config.yml index d7dc1aa958..cb22b94a3e 100644 --- a/_config.yml +++ b/_config.yml @@ -36,8 +36,10 @@ ucp_versions: path: /datacenter/ucp/1.1/overview/ dtr_versions: - - version: "2.3" + - version: "2.4" + path: /datacenter/dtr/2.3/guides/ latest: true + - version: "2.3" path: /datacenter/dtr/2.3/guides/ - version: "2.2" path: /datacenter/dtr/2.2/guides/ @@ -142,11 +144,18 @@ defaults: path: "datacenter" values: ucp_latest_image: "docker/ucp:2.2.4" - dtr_latest_image: "docker/dtr:2.3.4" + dtr_latest_image: "docker/dtr:2.4.0" enterprise: true + - scope: + path: "datacenter/dtr/2.4" + values: + dtr_org: "docker" + dtr_repo: "dtr" + dtr_version: "2.4.0" - scope: path: "datacenter/dtr/2.3" values: + hide_from_sitemap: true dtr_org: "docker" dtr_repo: "dtr" dtr_version: "2.3.4" diff --git a/_data/ddc_offline_files_2.yaml b/_data/ddc_offline_files_2.yaml index 4db03f653e..a2c5153e9b 100644 --- a/_data/ddc_offline_files_2.yaml +++ b/_data/ddc_offline_files_2.yaml @@ -2,7 +2,7 @@ # with all the images needed to install Docker Datacenter in an air-gapped # environment that can't access the internet -# Used by _includes/components/ddc_url_list.html +# Used by _includes/components/ddc_url_list_2.html - product: "ucp" version: "2.2" tar-files: @@ -30,6 +30,13 @@ url: https://packages.docker.com/caas/ucp_images_s390x_2.2.0.tar.gz - description: "2.2.0 Windows" url: https://packages.docker.com/caas/ucp_images_win_2.2.0.tar.gz +- product: "dtr" + version: "2.4" + tar-files: + - description: "DTR 2.4.0 Linux x86" + url: https://packages.docker.com/caas/dtr_images_2.4.0.tar.gz + - description: "DTR 2.4.0 IBM Z" + url: https://packages.docker.com/caas/dtr_images_s390x_2.4.0.tar.gz - product: "dtr" version: "2.3" tar-files: diff --git a/_data/toc.yaml b/_data/toc.yaml index 6c14e75e93..cc73e57724 100644 --- a/_data/toc.yaml +++ b/_data/toc.yaml @@ -1351,12 +1351,12 @@ reference: path: /registry/spec/api/ nosync: true - title: Trusted Registry API - path: /datacenter/dtr/2.3/reference/api/ + path: /datacenter/dtr/2.4/reference/api/ - title: Trusted Registry CLI - path: /datacenter/dtr/2.3/reference/cli/ + path: /datacenter/dtr/2.4/reference/cli/ nosync: true - title: Universal Control Plane CLI - path: /datacenter/ucp/2.1/reference/cli/ + path: /datacenter/ucp/2.2/reference/cli/ nosync: true samples: @@ -1944,146 +1944,286 @@ manuals: title: Release notes - sectiontitle: Docker Trusted Registry section: - - path: /datacenter/dtr/2.3/guides/ + - path: /datacenter/dtr/2.4/guides/ title: Docker Trusted Registry overview - - path: /datacenter/dtr/2.3/guides/architecture/ + - path: /datacenter/dtr/2.4/guides/architecture/ title: Architecture - sectiontitle: Administration section: - sectiontitle: Install section: - - path: /datacenter/dtr/2.3/guides/admin/install/system-requirements/ + - path: /datacenter/dtr/2.4/guides/admin/install/system-requirements/ title: System requirements - - path: /datacenter/dtr/2.3/guides/admin/install/ + - path: /datacenter/dtr/2.4/guides/admin/install/ title: Install - - path: /datacenter/dtr/2.3/guides/admin/install/install-offline/ + - path: /datacenter/dtr/2.4/guides/admin/install/install-offline/ title: Install offline - - path: /datacenter/dtr/2.3/guides/admin/upgrade/ + - path: /datacenter/dtr/2.4/guides/admin/upgrade/ title: Upgrade - - path: /datacenter/dtr/2.3/guides/admin/install/uninstall/ + - path: /datacenter/dtr/2.4/guides/admin/install/uninstall/ title: Uninstall - sectiontitle: Configure section: - - path: /datacenter/dtr/2.3/guides/admin/configure/license-your-installation/ + - path: /datacenter/dtr/2.4/guides/admin/configure/license-your-installation/ title: License your installation - - path: /datacenter/dtr/2.3/guides/admin/configure/use-your-own-tls-certificates/ + - path: /datacenter/dtr/2.4/guides/admin/configure/use-your-own-tls-certificates/ title: Use your own TLS certificates - - path: /datacenter/dtr/2.3/guides/admin/configure/enable-single-sign-on/ + - path: /datacenter/dtr/2.4/guides/admin/configure/enable-single-sign-on/ title: Enable single sign-on - sectiontitle: External storage section: - - path: /datacenter/dtr/2.3/guides/admin/configure/external-storage/ + - path: /datacenter/dtr/2.4/guides/admin/configure/external-storage/ title: Overview - - path: /datacenter/dtr/2.3/guides/admin/configure/external-storage/s3/ + - path: /datacenter/dtr/2.4/guides/admin/configure/external-storage/s3/ title: S3 - - path: /datacenter/dtr/2.3/guides/admin/configure/external-storage/nfs/ + - path: /datacenter/dtr/2.4/guides/admin/configure/external-storage/nfs/ title: NFS - - path: /datacenter/dtr/2.3/guides/admin/configure/set-up-high-availability/ + - path: /datacenter/dtr/2.4/guides/admin/configure/set-up-high-availability/ title: Set up high availability - - path: /datacenter/dtr/2.3/guides/admin/configure/use-a-load-balancer/ + - path: /datacenter/dtr/2.4/guides/admin/configure/use-a-load-balancer/ title: Use a load balancer - - path: /datacenter/dtr/2.3/guides/admin/configure/set-up-vulnerability-scans/ + - path: /datacenter/dtr/2.4/guides/admin/configure/set-up-vulnerability-scans/ title: Set up vulnerability scans - sectiontitle: Deploy caches section: - - path: /datacenter/dtr/2.3/guides/admin/configure/deploy-caches/ + - path: /datacenter/dtr/2.4/guides/admin/configure/deploy-caches/ title: Overview - - path: /datacenter/dtr/2.3/guides/admin/configure/deploy-caches/tls/ + - path: /datacenter/dtr/2.4/guides/admin/configure/deploy-caches/tls/ title: Deploy caches with TLS - - path: /datacenter/dtr/2.3/guides/admin/configure/deploy-caches/chaining/ + - path: /datacenter/dtr/2.4/guides/admin/configure/deploy-caches/chaining/ title: Chain multiple caches - - path: /datacenter/dtr/2.3/guides/admin/configure/garbage-collection/ + - path: /datacenter/dtr/2.4/guides/admin/configure/garbage-collection/ title: Garbage collection - - path: /datacenter/dtr/2.3/guides/admin/configure/use-a-web-proxy/ + - path: /datacenter/dtr/2.4/guides/admin/configure/use-a-web-proxy/ title: Use a web proxy - sectiontitle: Manage users section: - - path: /datacenter/dtr/2.3/guides/admin/manage-users/ + - path: /datacenter/dtr/2.4/guides/admin/manage-users/ title: Authentication and authorization - - path: /datacenter/dtr/2.3/guides/admin/manage-users/create-and-manage-users/ + - path: /datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-users/ title: Create and manage users - - path: /datacenter/dtr/2.3/guides/admin/manage-users/create-and-manage-teams/ + - path: /datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-teams/ title: Create and manage teams - - path: /datacenter/dtr/2.3/guides/admin/manage-users/create-and-manage-orgs/ + - path: /datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-orgs/ title: Create and manage organizations - - path: /datacenter/dtr/2.3/guides/admin/manage-users/permission-levels/ + - path: /datacenter/dtr/2.4/guides/admin/manage-users/permission-levels/ title: Permission levels - sectiontitle: Monitor and troubleshoot section: - - path: /datacenter/dtr/2.3/guides/admin/monitor-and-troubleshoot/ + - path: /datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/ title: Monitor the cluster status - - path: /datacenter/dtr/2.3/guides/admin/monitor-and-troubleshoot/troubleshoot-with-logs/ + - path: /datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/troubleshoot-with-logs/ title: Troubleshoot with logs - - path: /datacenter/dtr/2.3/guides/admin/monitor-and-troubleshoot/troubleshoot-batch-jobs/ + - path: /datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/troubleshoot-batch-jobs/ title: Troubleshoot batch jobs - - path: /datacenter/dtr/2.3/guides/admin/backups-and-disaster-recovery/ + - path: /datacenter/dtr/2.4/guides/admin/backups-and-disaster-recovery/ title: Backups and disaster recovery - sectiontitle: CLI reference section: - - path: /datacenter/dtr/2.3/reference/cli/ + - path: /datacenter/dtr/2.4/reference/cli/ title: Overview - - path: /datacenter/dtr/2.3/reference/cli/backup/ + - path: /datacenter/dtr/2.4/reference/cli/backup/ title: backup - - path: /datacenter/dtr/2.3/reference/cli/destroy/ + - path: /datacenter/dtr/2.4/reference/cli/destroy/ title: destroy - - path: /datacenter/dtr/2.3/reference/cli/dumpcerts/ + - path: /datacenter/dtr/2.4/reference/cli/dumpcerts/ title: dumpcerts - - path: /datacenter/dtr/2.3/reference/cli/images/ + - path: /datacenter/dtr/2.4/reference/cli/images/ title: images - - path: /datacenter/dtr/2.3/reference/cli/install/ + - path: /datacenter/dtr/2.4/reference/cli/install/ title: install - - path: /datacenter/dtr/2.3/reference/cli/join/ + - path: /datacenter/dtr/2.4/reference/cli/join/ title: join - - path: /datacenter/dtr/2.3/reference/cli/reconfigure/ + - path: /datacenter/dtr/2.4/reference/cli/reconfigure/ title: reconfigure - - path: /datacenter/dtr/2.3/reference/cli/remove/ + - path: /datacenter/dtr/2.4/reference/cli/remove/ title: remove - - path: /datacenter/dtr/2.3/reference/cli/restore/ + - path: /datacenter/dtr/2.4/reference/cli/restore/ title: restore - - path: /datacenter/dtr/2.3/reference/cli/upgrade/ + - path: /datacenter/dtr/2.4/reference/cli/upgrade/ title: upgrade - sectiontitle: User guides section: - sectiontitle: Access DTR section: - - path: /datacenter/dtr/2.3/guides/user/access-dtr/ + - path: /datacenter/dtr/2.4/guides/user/access-dtr/ title: Configure your Docker daemon - - path: /datacenter/dtr/2.3/guides/user/access-dtr/configure-your-notary-client/ + - path: /datacenter/dtr/2.4/guides/user/access-dtr/configure-your-notary-client/ title: Configure your Notary client - - path: /datacenter/dtr/2.3/guides/user/access-dtr/use-a-cache/ + - path: /datacenter/dtr/2.4/guides/user/access-dtr/use-a-cache/ title: Use a cache - sectiontitle: Manage images section: - - path: /datacenter/dtr/2.3/guides/user/manage-images/ + - path: /datacenter/dtr/2.4/guides/user/manage-images/ title: Create a repository - - path: /datacenter/dtr/2.3/guides/user/manage-images/pull-and-push-images/ + - path: /datacenter/dtr/2.4/guides/user/manage-images/pull-and-push-images/ title: Pull and push images - - path: /datacenter/dtr/2.3/guides/user/manage-images/delete-images/ + - path: /datacenter/dtr/2.4/guides/user/manage-images/delete-images/ title: Delete images - - path: /datacenter/dtr/2.3/guides/user/manage-images/scan-images-for-vulnerabilities/ + - path: /datacenter/dtr/2.4/guides/user/manage-images/scan-images-for-vulnerabilities/ title: Scan images for vulnerabilities - - path: /datacenter/dtr/2.3/guides/user/manage-images/prevent-tags-from-being-overwritten/ + - path: /datacenter/dtr/2.4/guides/user/manage-images/prevent-tags-from-being-overwritten/ title: Prevent tags from being overwritten - sectiontitle: Sign images section: - - path: /datacenter/dtr/2.3/guides/user/manage-images/sign-images/ + - path: /datacenter/dtr/2.4/guides/user/manage-images/sign-images/ title: Sign an image - - path: /datacenter/dtr/2.3/guides/user/manage-images/sign-images/delegate-image-signing/ + - path: /datacenter/dtr/2.4/guides/user/manage-images/sign-images/delegate-image-signing/ title: Delegate image signing - - path: /datacenter/dtr/2.3/guides/user/manage-images/sign-images/manage-trusted-repositories/ + - path: /datacenter/dtr/2.4/guides/user/manage-images/sign-images/manage-trusted-repositories/ title: Manage trusted repositories - - path: /datacenter/dtr/2.3/guides/user/create-and-manage-webhooks/ + - path: /datacenter/dtr/2.4/guides/user/create-and-manage-webhooks/ title: Create and manage webhooks - - path: /datacenter/dtr/2.3/guides/user/create-promotion-policies/ + - path: /datacenter/dtr/2.4/guides/user/create-promotion-policies/ title: Create promotion policies - - path: /datacenter/dtr/2.3/reference/api/ + - path: /datacenter/dtr/2.4/reference/api/ title: API reference - - path: /datacenter/dtr/2.3/guides/release-notes/ + - path: /datacenter/dtr/2.4/guides/release-notes/ title: Release notes - - path: /datacenter/dtr/2.3/guides/support/ + - path: /datacenter/dtr/2.4/guides/support/ title: Get support - sectiontitle: Previous versions section: + - sectiontitle: Docker Trusted Registry 2.3 + section: + - path: /datacenter/dtr/2.3/guides/ + title: Docker Trusted Registry overview + - path: /datacenter/dtr/2.3/guides/architecture/ + title: Architecture + - sectiontitle: Administration + section: + - sectiontitle: Install + section: + - path: /datacenter/dtr/2.3/guides/admin/install/system-requirements/ + title: System requirements + - path: /datacenter/dtr/2.3/guides/admin/install/ + title: Install + - path: /datacenter/dtr/2.3/guides/admin/install/install-offline/ + title: Install offline + - path: /datacenter/dtr/2.3/guides/admin/upgrade/ + title: Upgrade + - path: /datacenter/dtr/2.3/guides/admin/install/uninstall/ + title: Uninstall + - sectiontitle: Configure + section: + - path: /datacenter/dtr/2.3/guides/admin/configure/license-your-installation/ + title: License your installation + - path: /datacenter/dtr/2.3/guides/admin/configure/use-your-own-tls-certificates/ + title: Use your own TLS certificates + - path: /datacenter/dtr/2.3/guides/admin/configure/enable-single-sign-on/ + title: Enable single sign-on + - sectiontitle: External storage + section: + - path: /datacenter/dtr/2.3/guides/admin/configure/external-storage/ + title: Overview + - path: /datacenter/dtr/2.3/guides/admin/configure/external-storage/s3/ + title: S3 + - path: /datacenter/dtr/2.3/guides/admin/configure/external-storage/nfs/ + title: NFS + - path: /datacenter/dtr/2.3/guides/admin/configure/set-up-high-availability/ + title: Set up high availability + - path: /datacenter/dtr/2.3/guides/admin/configure/use-a-load-balancer/ + title: Use a load balancer + - path: /datacenter/dtr/2.3/guides/admin/configure/set-up-vulnerability-scans/ + title: Set up vulnerability scans + - sectiontitle: Deploy caches + section: + - path: /datacenter/dtr/2.3/guides/admin/configure/deploy-caches/ + title: Overview + - path: /datacenter/dtr/2.3/guides/admin/configure/deploy-caches/tls/ + title: Deploy caches with TLS + - path: /datacenter/dtr/2.3/guides/admin/configure/deploy-caches/chaining/ + title: Chain multiple caches + - path: /datacenter/dtr/2.3/guides/admin/configure/garbage-collection/ + title: Garbage collection + - path: /datacenter/dtr/2.3/guides/admin/configure/use-a-web-proxy/ + title: Use a web proxy + - sectiontitle: Manage users + section: + - path: /datacenter/dtr/2.3/guides/admin/manage-users/ + title: Authentication and authorization + - path: /datacenter/dtr/2.3/guides/admin/manage-users/create-and-manage-users/ + title: Create and manage users + - path: /datacenter/dtr/2.3/guides/admin/manage-users/create-and-manage-teams/ + title: Create and manage teams + - path: /datacenter/dtr/2.3/guides/admin/manage-users/create-and-manage-orgs/ + title: Create and manage organizations + - path: /datacenter/dtr/2.3/guides/admin/manage-users/permission-levels/ + title: Permission levels + - sectiontitle: Monitor and troubleshoot + section: + - path: /datacenter/dtr/2.3/guides/admin/monitor-and-troubleshoot/ + title: Monitor the cluster status + - path: /datacenter/dtr/2.3/guides/admin/monitor-and-troubleshoot/troubleshoot-with-logs/ + title: Troubleshoot with logs + - path: /datacenter/dtr/2.3/guides/admin/monitor-and-troubleshoot/troubleshoot-batch-jobs/ + title: Troubleshoot batch jobs + - path: /datacenter/dtr/2.3/guides/admin/backups-and-disaster-recovery/ + title: Backups and disaster recovery + - sectiontitle: CLI reference + section: + - path: /datacenter/dtr/2.3/reference/cli/ + title: Overview + - path: /datacenter/dtr/2.3/reference/cli/backup/ + title: backup + - path: /datacenter/dtr/2.3/reference/cli/destroy/ + title: destroy + - path: /datacenter/dtr/2.3/reference/cli/dumpcerts/ + title: dumpcerts + - path: /datacenter/dtr/2.3/reference/cli/images/ + title: images + - path: /datacenter/dtr/2.3/reference/cli/install/ + title: install + - path: /datacenter/dtr/2.3/reference/cli/join/ + title: join + - path: /datacenter/dtr/2.3/reference/cli/reconfigure/ + title: reconfigure + - path: /datacenter/dtr/2.3/reference/cli/remove/ + title: remove + - path: /datacenter/dtr/2.3/reference/cli/restore/ + title: restore + - path: /datacenter/dtr/2.3/reference/cli/upgrade/ + title: upgrade + - sectiontitle: User guides + section: + - sectiontitle: Access DTR + section: + - path: /datacenter/dtr/2.3/guides/user/access-dtr/ + title: Configure your Docker daemon + - path: /datacenter/dtr/2.3/guides/user/access-dtr/configure-your-notary-client/ + title: Configure your Notary client + - path: /datacenter/dtr/2.3/guides/user/access-dtr/use-a-cache/ + title: Use a cache + - sectiontitle: Manage images + section: + - path: /datacenter/dtr/2.3/guides/user/manage-images/ + title: Create a repository + - path: /datacenter/dtr/2.3/guides/user/manage-images/pull-and-push-images/ + title: Pull and push images + - path: /datacenter/dtr/2.3/guides/user/manage-images/delete-images/ + title: Delete images + - path: /datacenter/dtr/2.3/guides/user/manage-images/scan-images-for-vulnerabilities/ + title: Scan images for vulnerabilities + - path: /datacenter/dtr/2.3/guides/user/manage-images/prevent-tags-from-being-overwritten/ + title: Prevent tags from being overwritten + - sectiontitle: Sign images + section: + - path: /datacenter/dtr/2.3/guides/user/manage-images/sign-images/ + title: Sign an image + - path: /datacenter/dtr/2.3/guides/user/manage-images/sign-images/delegate-image-signing/ + title: Delegate image signing + - path: /datacenter/dtr/2.3/guides/user/manage-images/sign-images/manage-trusted-repositories/ + title: Manage trusted repositories + - path: /datacenter/dtr/2.3/guides/user/create-and-manage-webhooks/ + title: Create and manage webhooks + - path: /datacenter/dtr/2.3/guides/user/create-promotion-policies/ + title: Create promotion policies + - path: /datacenter/dtr/2.3/reference/api/ + title: API reference + - path: /datacenter/dtr/2.3/guides/release-notes/ + title: Release notes + - path: /datacenter/dtr/2.3/guides/support/ + title: Get support - sectiontitle: Docker Trusted Registry 2.2 section: - path: /datacenter/dtr/2.2/guides/ diff --git a/datacenter/dtr/2.3/guides/index.md b/datacenter/dtr/2.3/guides/index.md index 72cafa9fce..4ad0f9cb34 100644 --- a/datacenter/dtr/2.3/guides/index.md +++ b/datacenter/dtr/2.3/guides/index.md @@ -2,10 +2,6 @@ title: Docker Trusted Registry overview description: Learn how to install, configure, and use Docker Trusted Registry. keywords: registry, repository, images -redirect_from: -- /docker-hub-enterprise/ -- /docker-trusted-registry/overview/ -- /docker-trusted-registry/ --- Docker Trusted Registry (DTR) is the enterprise-grade image storage solution diff --git a/datacenter/dtr/2.4/guides/admin/backups-and-disaster-recovery.md b/datacenter/dtr/2.4/guides/admin/backups-and-disaster-recovery.md new file mode 100644 index 0000000000..eca6a97614 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/backups-and-disaster-recovery.md @@ -0,0 +1,237 @@ +--- +title: DTR backups and recovery +description: Learn how to back up your Docker Trusted Registry cluster, and to recover your cluster from an existing backup. +keywords: registry, high-availability, backup, recovery +--- + +{% assign image_backup_file = "backup-images.tar" %} +{% assign metadata_backup_file = "backup-metadata.tar" %} + +DTR requires that a majority (n/2 + 1) of its replicas are healthy at all times +for it to work. So if a majority of replicas is unhealthy or lost, the only +way to restore DTR to a working state, is by recovering from a backup. This +is why it's important to ensure replicas are healthy and perform frequent +backups. + +## Data managed by DTR + +Docker Trusted Registry maintains data about: + +| Data | Description | +|:-----------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------| +| Configurations | The DTR cluster configurations | +| Repository metadata | The metadata about the repositories and images deployed | +| Access control to repos and images | Permissions for teams and repositories | +| Notary data | Notary tags and signatures | +| Scan results | Security scanning results for images | +| Certificates and keys | The certificates, public keys, and private keys that are used for mutual TLS communication | +| Images content | The images you push to DTR. This can be stored on the filesystem of the node running DTR, or other storage system, depending on the configuration | + +This data is persisted on the host running DTR, using named volumes. +[Learn more about DTR named volumes](../architecture.md). + +To perform a backup of a DTR node, run the `docker/dtr backup` command. This +command backups up the following data: + +| Data | Backed up | Description | +|:-----------------------------------|:----------|:---------------------------------------------------------------| +| Configurations | yes | DTR settings | +| Repository metadata | yes | Metadata like image architecture and size | +| Access control to repos and images | yes | Data about who has access to which images | +| Notary data | yes | Signatures and digests for images that are signed | +| Scan results | yes | Information about vulnerabilities in your images | +| Certificates and keys | yes | TLS certificates and keys used by DTR | +| Image content | no | Needs to be backed up separately, depends on DTR configuration | +| Users, orgs, teams | no | Create a UCP backup to backup this data | +| Vulnerability database | no | Can be re-downloaded after a restore | + + +## Backup DTR data + +To create a backup of DTR you need to: + +1. Backup image content +2. Backup DTR metadata + +You should always create backups from the same DTR replica, to ensure a smoother +restore. + +### Backup image content + +Since you can configure the storage backend that DTR uses to store images, +the way you backup images depends on the storage backend you're using. + +If you've configured DTR to store images on the local filesystem or NFS mount, +you can backup the images by using ssh to log into a node where DTR is running, +and creating a tar archive of the [dtr-registry volume](../architecture.md): + +```none +{% raw %} +sudo tar -cf {{ image_backup_file }} \ +$(dirname $(docker volume inspect --format '{{.Mountpoint}}' dtr-registry-)) +{% endraw %} +``` + +If you're using a different storage backend, follow the best practices +recommended for that system. + + +### Backup DTR metadata + +To create a DTR backup, load your UCP client bundle, and run the following +command, replacing the placeholders for the real values: + +```none +read -sp 'ucp password: ' UCP_PASSWORD; \ +docker run --log-driver none -i --rm \ + --env UCP_PASSWORD=$UCP_PASSWORD \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} backup \ + --ucp-url \ + --ucp-insecure-tls \ + --ucp-username \ + --existing-replica-id > backup-metadata.tar +``` + +Where: + +* `` is the url you use to access UCP +* `` is the username of a UCP administrator +* `` is the id of the DTR replica to backup + + +This prompts you for the UCP password, backups up the DTR metadata and saves the +result into a tar archive. You can learn more about the supported flags in +the [reference documentation](../../reference/cli/backup.md). + +The backup command doesn't stop DTR, so that you can take frequent backups +without affecting your users. Also, the backup contains sensitive information +like private keys, so you can encrypt the backup by running: + +```none +gpg --symmetric {{ backup-metadata.tar }} +``` + +This prompts you for a password to encrypt the backup, copies the backup file +and encrypts it. + +### Test your backups + +To validate that the backup was correctly performed, you can print the contents +of the tar file created. The backup of the images should look like: + +```none +tar -tf {{ image_backup_file }} + +dtr-backup-v{{ page.dtr_version }}/ +dtr-backup-v{{ page.dtr_version }}/rethink/ +dtr-backup-v{{ page.dtr_version }}/rethink/layers/ +``` + +And the backup of the DTR metadata should look like: + +```none +tar -tf {{ backup-metadata.tar }} + +# The archive should look like this +dtr-backup-v{{ page.dtr_version }}/ +dtr-backup-v{{ page.dtr_version }}/rethink/ +dtr-backup-v{{ page.dtr_version }}/rethink/properties/ +dtr-backup-v{{ page.dtr_version }}/rethink/properties/0 +``` + +If you've encrypted the metadata backup, you can use: + +```none +gpg -d /tmp/backup.tar.gpg | tar -t +``` + +You can also create a backup of a UCP cluster and restore it into a new +cluster. Then restore DTR on that new cluster to confirm that everything is +working as expected. + +## Restore DTR data + +If your DTR has a majority of unhealthy replicas, the one way to restore it to +a working state is by restoring from an existing backup. + +To restore DTR, you need to: + +1. Stop any DTR containers that might be running +2. Restore the images from a backup +3. Restore DTR metadata from a backup +4. Re-fetch the vulnerability database + +You need to restore DTR on the same UCP cluster where you've created the +backup. If you restore on a different UCP cluster, all DTR resources will be +owned by users that don't exist, so you'll not be able to manage the resources, +even though they're stored in the DTR data store. + +When restoring, you need to use the same version of the `docker/dtr` image +that you've used when creating the update. Other versions are not guaranteed +to work. + +### Stop DTR containers + +Start by removing any DTR container that is still running: + +```none +docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} destroy \ + --ucp-insecure-tls +``` + +### Restore images + +If you had DTR configured to store images on the local filesystem, you can +extract your backup: + +```none +sudo tar -xzf {{ image_backup_file }} -C /var/lib/docker/volumes +``` + +If you're using a different storage backend, follow the best practices +recommended for that system. When restoring the DTR metadata, DTR will be +deployed with the same configurations it had when creating the backup. + + +### Restore DTR metadata + +You can restore the DTR metadata with the `docker/dtr restore` command. This +performs a fresh installation of DTR, and reconfigures it with +the configuration created during a backup. + +Load your UCP client bundle, and run the following command, replacing the +placeholders for the real values: + +```none +read -sp 'ucp password: ' UCP_PASSWORD; \ +docker run -i --rm \ + --env UCP_PASSWORD=$UCP_PASSWORD \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} restore \ + --ucp-url \ + --ucp-insecure-tls \ + --ucp-username \ + --ucp-node \ + --replica-id \ + --dtr-external-url < {{ metadata_backup_file }} +``` + +Where: + +* `` is the url you use to access UCP +* `` is the username of a UCP administrator +* `` is the hostname of the node where you've restored the images +* `` the id of the replica you backed up +* ``the url that clients use to access DTR + +### Re-fetch the vulnerability database + +If you're scanning images, you now need to download the vulnerability database. + +After you successfully restore DTR, you can join new replicas the same way you +would after a fresh installation. [Learn more](configure/set-up-vulnerability-scans.md). + +## Where to go next + +* [Set up high availability](configure/set-up-high-availability.md) +* [DTR architecture](../architecture.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/chaining.md b/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/chaining.md new file mode 100644 index 0000000000..63184c38cf --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/chaining.md @@ -0,0 +1,75 @@ +--- +title: Chain multiple caches +description: Learn how to deploy and chain multiple caches for Docker Trusted Registry, to cover multiple regions or offices +keywords: dtr, tls +--- + +If your users are distributed geographically, consider chaining multiple DTR +caches together for faster pulls. + +![cache chaining](../../../images/chaining-1.svg) + +Too many levels of chaining might slow down pulls, so you should try different +configurations and benchmark them, to find out the right configuration. + +In this example we'll show how to configure two caches. A dedicated cache for +the Asia region that pulls images directly from DTR, and a cache for China, that +pulls images from the Asia cache. + +## Cache for the Asia region + +This cache has TLS, and pulls images directly from DTR: + +``` +version: 0.1 +storage: + delete: + enabled: true + filesystem: + rootdirectory: /var/lib/registry +http: + addr: :5000 + tls: + certificate: /certs/asia-ca.pem + key: /certs/asia-key.pem +middleware: + registry: + - name: downstream + options: + blobttl: 24h + upstreams: + - https:// + cas: + - /certs/dtr-ca.pem +``` + +## Cache for the China region + +This cache has TLS, and pulls images from the Asia cache: + +``` +version: 0.1 +storage: + delete: + enabled: true + filesystem: + rootdirectory: /var/lib/registry +http: + addr: :5000 + tls: + certificate: /certs/china-ca.pem + key: /certs/china-key.pem +middleware: + registry: + - name: downstream + options: + blobttl: 24h + upstreams: + - https:// + cas: + - /certs/asia-cache-ca.pem +``` + +Since the China cache doesn't need to communicate directly with DTR, +it only needs to trust the CA certificates for the next hop, in this case +the CA certificate used by the Asia cache. diff --git a/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/index.md b/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/index.md new file mode 100644 index 0000000000..aac2639ec6 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/index.md @@ -0,0 +1,224 @@ +--- +title: Deploy DTR caches +description: Learn how to deploy and configure DTR caches, so that users can pull images faster. +keywords: registry, dtr, cache +--- + + +You can configure DTR to have multiple caches. Once you've deployed caches, +users can configure their DTR user account to specify which cache to pull from. + +Then, when users pull from DTR, they are redirected to pull from the cache +configured on their user account. By deploying caches geographically closer to remote +offices and low connectivity areas, users can pull images faster. + +User requests are authenticated when pulling from a cache. Users can only pull +images from a cache if they have access. And if the image has changed in DTR, +users will pull the latest version, not an outdated one. + +## How caches work + +After you've deployed the caches, users can configure which cache to +pull from on their DTR user settings page. + +![](../../../images/cache-docker-images-1.svg) + +When users try to pull an image by running +`docker pull //`, the following happens: + +1. The Docker client makes a request to DTR which in turn authenticates the +request +2. The Docker client requests the image manifest to DTR. This ensures that +users will always pull the correct image, and not an outdated version +3. The Docker client requests the layer blobs to DTR, which becomes signed +and redirected to the cache configured by the user +4. If the blob exists on the cache it is sent to the user. Otherwise, the cache +pulls it from DTR and sends it to the user + +When a user pushes an image, that image is pushed directly to DTR. A cache +will only store the image when a user tries to pull the image using that cache. + +## Configure the cache + +DTR caches are based on Docker Registry, and use the same configuration +file format. +[Learn more about the configuration options](/registry/configuration.md). + +The DTR cache extends the Docker Registry configuration file format by +introducing a new middleware called `downstream` that has three configuration +options: `blobttl`, `upstreams`, and `cas`: + +```none +# Settings that you would include in a +# Docker Registry configuration file followed by + +middleware: + registry: + - name: downstream + options: + blobttl: 24h + upstreams: + - + cas: + - +``` + +Below you can find the description for each parameter, specific to DTR caches. + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDescription
+ blobttl + + no + +The TTL for blobs in the cache. This field takes a positive integer and an optional suffix indicating the unit of time. If +this field is configured, "storage.delete.enabled" must be configured to true. Possible units are: +
    +
  • ns (nanoseconds)
  • +
  • us (microseconds)
  • +
  • ms (milliseconds)
  • +
  • s (seconds)
  • +
  • m (minutes)
  • +
  • h (hours)
  • +
+ If you omit the suffix, the system interprets the value as nanoseconds. +
+ cas + + no + + An optional list of absolute paths to PEM-encoded CA certificates of upstream registries or content caches. +
+ upstreams + + yes + + A list of externally-reachable addresses for upstream registries of content caches. If more than one host is specified, it will pull from registries in round-robin order. +
+ +## Deploy a simple cache + +You can deploy a Docker Content Cache on any host that has Docker installed. +The only requirements are that: + +* Users need to have access to both DTR and the cache +* The cache needs access to DTR + +![](../../../images/cache-docker-images-2.svg) + +On the host where the cache will be deployed, create a `config.yml` file with +the following content: + +``` +version: 0.1 +storage: + delete: + enabled: true + filesystem: + rootdirectory: /var/lib/registry +http: + addr: :5000 +middleware: + registry: + - name: downstream + options: + blobttl: 24h + upstreams: + - https:// + cas: + - /certs/dtr-ca.pem +``` + +This configures the cache to store the images in the directory +`/var/lib/registry`, exposes the cache service on port 5000, and configures the +cache to delete images that are not pulled in the last 24 hours. It also +defines where DTR can be reached, and which CA certificates should be trusted. + +Now we need to download the CA certificate used by DTR. For this, run: + +``` +curl -k https:///ca > dtr-ca.pem +``` + +Now that we've got the cache configuration file and DTR CA certificate, we can +deploy the cache by running: + +```none +docker run --detach --restart always \ + --name dtr-cache \ + --publish 5000:5000 \ + --volume $(pwd)/dtr-ca.pem:/certs/dtr-ca.pem \ + --volume $(pwd)/config.yml:/config.yml \ + {{ page.dtr_org }}/dtr-content-cache:{{ page.dtr_version }} /config.yml +``` + +You can also run the command in interactive mode instead of detached by +replacing `--detached` with `--interactive`. This allows you to +see the logs generated by the container and troubleshoot misconfigurations. + +Now that you've deployed a cache, you need to configure DTR to know about it. +This is done using the `POST /api/v0/content_caches` API. You can use the +DTR interactive API documentation to use this API. + +In the DTR web UI, click the top-right menu, and choose **API docs**. + +![](../../../images/cache-docker-images-2.png){: .with-border} + +Navigate to the `POST /api/v0/content_caches` line and click it to expand. +In the **body** field include: + +``` +{ + "name": "region-us", + "host": "http://:5000" +} +``` + +Click the **Try it out!** button to make the API call. + +![](../../../images/cache-docker-images-3.png){: .with-border} + +Now that DTR knows about the cache we've created, we just need to configure +our DTR user settings to start using that cache. + +In the DTR web UI, navigate to your **user profile**, click the **Settings** +tab, and change the **Content Cache** settings to use the **region-us** cache. + +![](../../../images/cache-docker-images-4.png){: .with-border} + +You can also automate this through the `/api/v0/accounts/{username}/settings` +API. + +Now when you pull images, you'll be using the cache. To test this, try pulling +an image from DTR. You can inspect the logs of the cache service, to validate +that the cache is being used, and troubleshoot problems. + +In the host where you've deployed the `region-us` cache, run: + +``` +docker container logs dtr-cache +``` + +## Where to go next + +* [Deploy caches with TLS](tls.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/tls.md b/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/tls.md new file mode 100644 index 0000000000..fb4f073da1 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/deploy-caches/tls.md @@ -0,0 +1,93 @@ +--- +title: Deploy caches with TLS +description: Learn how to deploy and secure caches for Docker Trusted Registry, leveraging TLS +keywords: dtr, tls +--- + +When running DTR caches on a production environment, you should secure them +with TLS. In this example we're going to deploy a DTR cache that uses TLS. + +DTR caches use the same configuration file format used by Docker Registry. +You can learn more about the supported configuration in the +[Docker Registry documentation](/registry/configuration.md#tls). + + +## Get the TLS certificate and keys + +Before deploying a DTR cache with TLS you need to get a public key +certificate for the domain name were you'll deploy the cache. You'll also +need the public and private key files for that certificate. + +Once you have then, transfer those file to the host where you'll deploy +the DTR cache. + + +## Create the cache configuration + +Use SSH to log into the host where you'll deploy the DTR cache, and navigate to +the directory where you've stored the TLS certificate and keys. + +Create the `config.yml` file with the following content: + +``` +version: 0.1 +storage: + delete: + enabled: true + filesystem: + rootdirectory: /var/lib/registry +http: + addr: :5000 + tls: + certificate: /certs/dtr-cache-ca.pem + key: /certs/dtr-cache-key.pem +middleware: + registry: + - name: downstream + options: + blobttl: 24h + upstreams: + - https:// + cas: + - /certs/dtr-ca.pem +``` + +The configuration file mentions: + +* /certs/dtr-cache-ca.pem: this is the public key certificate the cache will use +* /certs/dtr-cache-key.pem: this is the TLS private key +* /certs/dtr-ca.pem is the CA certificate used by DTR + +Run this command to download the CA certificate used by DTR: + +``` +curl -k https:///ca > dtr-ca.pem +``` + +Now that we've got the cache configuration file and TLS certificates, we can +deploy the cache by running: + +```none +docker run --detach --restart always \ + --name dtr-cache \ + --publish 5000:5000 \ + --volume $(pwd)/dtr-cache-ca.pem:/certs/dtr-cache-ca.pem \ + --volume $(pwd)/dtr-cache-key.pem:/certs/dtr-cache-key.pem \ + --volume $(pwd)/dtr-ca.pem:/certs/dtr-ca.pem \ + --volume $(pwd)/config.yml:/config.yml \ + docker/dtr-content-cache:{{ page.dtr_version }} /config.yml +``` + +## Use Let's Encrypt + +You can also use Let's Encrypt to automatically generate TLS certificates that +are trusted by most clients. + +Learn more [about Let's Encrypt](https://letsencrypt.org/how-it-works/), and +how to +[create a configuration file that leverages it](/registry/configuration.md#letsencrypt). + + +## Where to go next + +* [Chain multiple caches](chaining.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/enable-single-sign-on.md b/datacenter/dtr/2.4/guides/admin/configure/enable-single-sign-on.md new file mode 100644 index 0000000000..da8012e30c --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/enable-single-sign-on.md @@ -0,0 +1,42 @@ +--- +title: Enable single sign-on +description: Learn how to set up single sign-on between UCP and DTR, so that your users only have to authenticate once +keywords: dtr, login, sso +--- + +By default, users are shared between UCP and DTR, but you have to authenticate +separately on the web UI of both applications. + +You can configure DTR to have single sign-on (SSO) with UCP, so that users only +have to authenticate once. + +## At installation time + +When installing DTR, use the `docker/dtr install --dtr-external-url ` +option to enable SSO. When accessing the DTR web UI, users are redirected to the +UCP login page, and once they are authenticated, they're redirected to the URL +you provided to `--dtr-external-url`. + +Use the domain name of DTR, or the domain name of a load balancer, if you're +using one, to load-balance requests across multiple DTR replicas. + +## After install + +In your browser, navigate to the DTR web UI, and choose **Settings**. In the +**General** tab, scroll to **Domain & proxies**. + +Update the **Load balancer / public address** field to the url where users +should be redirected once they are logged in. +Use the domain name of DTR, or the domain name of a load balancer, if you're +using one, to load-balance requests across multiple DTR replicas. + +Then enable **Use single sign-on**. + +![](../../images/enable-sso-1.png){: .with-border} + +Once you save, users are redirected to UCP for logging in, and redirected back to +DTR once they are authenticated. + +## Where to go next + +* [Use your own TLS certificates](use-your-own-tls-certificates.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/external-storage/index.md b/datacenter/dtr/2.4/guides/admin/configure/external-storage/index.md new file mode 100644 index 0000000000..dd3a2d9d29 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/external-storage/index.md @@ -0,0 +1,76 @@ +--- +title: Configure DTR image storage +description: Storage configuration for Docker Trusted Registry +keywords: storage drivers, NFS, Azure, S3 +--- + +By default DTR uses the local filesystem of the node where it is running to +store your Docker images. You can configure DTR to use an external storage +backend, for improved performance or high availability. + +![architecture diagram](../../../images/configure-external-storage-1.svg) + +If your DTR deployment only has a single replica, you can continue using the +local filesystem to store your Docker images. If your DTR deployment has +multiple replicas, for high availability, you need to ensure all replicas are +using the same storage backend. When a user pulls an image, the node serving +the request needs to have access to that image. + +DTR supports these storage systems: + +* Local filesystem +* NFS +* Amazon S3 or compatible +* Google Cloud Storage +* Microsoft Azure Blob storage +* OpenStack Swift + +To configure the storage backend, you can log into the **DTR web UI** +as an administrator user, navigate to the **Settings** page, and choose +**Storage**. + +![dtr settings](../../../images/configure-external-storage-2.png){: .with-border} + +The storage configuration page in the DTR web UI has options for the most +common configuration options, but you can also upload a yaml configuration file. + +The format of this configuration file is similar to the one used by +[Docker Registry](/registry/configuration.md). + +## Local filesystem + +By default, DTR creates a volume named `dtr-registry-` to store +your images using the local filesystem. You can customize the name and path of +the volume used by DTR, using the `docker/dtr reconfigure --dtr-storage-volume` +option. + +If you're deploying DTR with high-availability, you need to use NFS or any other +centralized storage backend so that all your DTR replicas have access to the +same images. + +To check how much space your images are taking in the local filesystem, you +can ssh into the node where DTR is deployed and run: + +``` +{% raw %} +# Find the path to the volume +docker volume inspect dtr-registry- + +# Check the disk usage +sudo du -hs \ +$(dirname $(docker volume inspect --format '{{.Mountpoint}}' dtr-registry-)) +{% endraw %} +``` + +## NFS + +You can configure your DTR replicas to store images on an NFS partition, so that +all replicas can share the same storage backend. + +[Learn how to configure DTR with NFS](nfs.md). + + +## Amazon S3 + +DTR supports AWS3 or other storage systems that are S3-compatible like Minio. +[Learn how to configure DTR with Amazon S3](s3.md). diff --git a/datacenter/dtr/2.4/guides/admin/configure/external-storage/nfs.md b/datacenter/dtr/2.4/guides/admin/configure/external-storage/nfs.md new file mode 100644 index 0000000000..e6c66280e5 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/external-storage/nfs.md @@ -0,0 +1,71 @@ +--- +title: Use NFS +description: Learn how to integrate Docker Trusted Registry with NFS +keywords: registry, dtr, storage, nfs +--- + +You can configure DTR to store Docker images in an NFS directory. + +Before installing or configuring DTR to use an NFS directory, make sure that: + +* The NFS server has been correctly configured +* The NFS server has a fixed IP address +* All hosts running DTR have the correct NFS libraries installed + + +To confirm that the hosts can connect to the NFS server, try to list the +directories exported by your NFS server: + +```bash +showmount -e +``` + +You should also try to mount one of the exported directories: + +```bash +mkdir /tmp/mydir && sudo mount -t nfs : +``` + +## Install DTR with NFS + +One way to configure DTR to use an NFS directory is at install time: + +```none +docker run -it --rm {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ dtr_version }} install \ + --nfs-storage-url \ + +``` + +The NFS storage URL should be in the format `nfs:///`. + +When you join replicas to the DTR cluster, the replicas will pick up that +configuration, so you don't need to specify it again. + +### Reconfigure DTR to use NFS + +If you're upgrading from a previous version of DTR and are already using +NFS you can continue using the same configurations. + +If you want to start using the new DTR built-in support for NFS you can +reconfigure DTR: + +```none +docker run -it --rm {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ dtr_version }} reconfigure \ + --nfs-storage-url +``` + +If you want to reconfigure DTR to stop using NFS storage, leave the option +in blank: + +```none +docker run -it --rm {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ dtr_version}} reconfigure \ + --nfs-storage-url "" +``` + +If the IP address of your NFS server changes, even if the DNS address is kept +the same, you should reconfigure DTR to stop using NFS storage, and then +add it back again. + +## Where to go next + +* [Configure where images are stored](index.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/external-storage/s3.md b/datacenter/dtr/2.4/guides/admin/configure/external-storage/s3.md new file mode 100644 index 0000000000..e86bb96700 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/external-storage/s3.md @@ -0,0 +1,111 @@ +--- +title: Store images on Amazon S3 +description: Learn how to configure Docker Trusted Registry to store Docker images on + Amazon S3 +keywords: dtr, storage driver, s3 +--- + +You can configure DTR to store Docker images on Amazon S3, or other file servers +with an S3-compatible API like Minio. + +Amazon S3 and compatible services store files in "buckets", and users have +permissions to read, write, and delete files from those buckets. When you +integrate DTR with Amazon S3, DTR sends all read and write operations to the +S3 bucket so that the images are persisted there. + +## Create a bucket on Amazon S3 + +Before configuring DTR you need to create a bucket on Amazon S3. +To get faster pulls and pushes, you should create the S3 bucket on a region +that's physically close to the servers where DTR is running. + +Start by +[creating a bucket](http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html). +Then, as a best practice you should +[create a new IAM user](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) +just for the DTR +integration and apply an IAM policy that ensures the user has limited permissions. + +This user only needs permissions to access the bucket that you'll use to store +images, and be able to read, write, and delete files. + +Here's an example of a policy like that: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "s3:ListAllMyBuckets", + "Resource": "arn:aws:s3:::*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:ListBucket", + "s3:GetBucketLocation", + "s3:ListBucketMultipartUploads" + ], + "Resource": "arn:aws:s3:::" + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject", + "s3:ListBucketMultipartUploads" + ], + "Resource": "arn:aws:s3:::/*" + } + ] +} + +``` + + + +## Configure DTR + +Once you've created a bucket and user, you can configure DTR to use it. +Navigate to the **DTR web UI**, go to **Settings**, and choose **Storage**. + +![](../../../images/s3-1.png){: .with-border} + +Select the **S3** option, and fill-in the information about the bucket and +user. + +| Field | Description | +|:----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Root directory | The path in the bucket where images are stored | +| AWS Region name | The region where the bucket is. [Learn more](http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) | +| S3 bucket name | The name of the bucket to store the images | +| AWS access key | The access key to use to access the S3 bucket. This can be left empty if you're using an IAM policy. [Learn more](http://docs.aws.amazon.com/general/latest/gr/managing-aws-access-keys.html) | +| AWS secret key | The secret key to use to access the S3 bucket. This can be left empty if you're using an IAM policy | +| Region endpoint | The endpoint name for the region you're using. [Learn more](http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) | + +There are also some advanced settings. + +| Field | Description | +|:-------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------| +| Signature version 4 auth | Authenticate the requests using AWS signature version 4. [Learn more](http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) | +| Use HTTPS | Secure all requests with HTTPS, or make requests in an insecure way | +| Skip TLS verification | Encrypt all traffic, but don't verify the TLS certificate used by the storage backend | +| Root CA certificate | The public key certificate of the root certificate authority that issued the storage backend certificate | + +Once you click **Save**, DTR validates the configurations and saves the changes. + +## Configure your clients + +If you're using a TLS certificate in your storage backend that's not globally +trusted, you'll have to configure all Docker Engines that push or pull from DTR +to trust that certificate. When you push or pull an image DTR redirects the +requests to the storage backend, so if clients don't trust the TLS certificates +of both DTR and the storage backend, they won't be able to push or pull images. +[Learn how to configure the Docker client](../../../user/access-dtr/index.md). + +And if you've configured DTR to skip TLS verification, you also need to +configure all Docker Engines that push or pull from DTR to skip TLS +verification. You do this by adding DTR to +the [list of insecure registries when starting Docker](/engine/reference/commandline/dockerd.md). diff --git a/datacenter/dtr/2.4/guides/admin/configure/garbage-collection.md b/datacenter/dtr/2.4/guides/admin/configure/garbage-collection.md new file mode 100644 index 0000000000..43c67517e6 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/garbage-collection.md @@ -0,0 +1,85 @@ +--- +title: Garbage collection +description: Save disk space by configuring the garbage collection settings in + Docker Trusted Registry +keywords: registry, garbage collection, gc, space, disk space +--- + +You can configure Docker Trusted Registry to automatically delete unused image +layers, thus saving you disk space. This process is also known as garbage collection. + +## How DTR deletes unused layers + +First you configure DTR to run a garbage collection job on a fixed schedule. At +the scheduled time: + +1. DTR becomes read-only. Images can be pulled, but pushes are not allowed. +2. DTR identifies and marks all unused image layers. +3. DTR deletes the marked image layers. + +Since this process puts DTR in read-only mode and is CPU-intensive, you should +run garbage collection jobs outside business peak hours. + +## Schedule garbage collection + +Navigate to the **Settings** page, and choose **Garbage collection**. + +![](../../images/garbage-collection-1.png){: .with-border} + +Select for how long the garbage collection job should run: +* Until done: Run the job until all unused image layers are deleted. +* For x minutes: Only run the garbage collection job for a maximum of x minutes +at a time. +* Never: Never delete unused image layers. + +Once you select for how long to run the garbage collection job, you can +configure its schedule (in UTC time) using the cron format. + +![](../../images/garbage-collection-2.png){: .with-border} + +Once everything is configured you can chose to **Save & start** to immediately +run the garbage collection job, or just **Save** to run the job on the next +scheduled interval. + +## Stop the garbage collection job + +Once the garbage collection job starts running, a banner is displayed on the +web UI explaining that users can't push images. If you're an administrator, you can click the banner to stop the garbage +collection job. + +![](../../images/garbage-collection-3.png){: .with-border} + +## Under the hood + +Each image stored in DTR is made up of multiple files: + +* A list of image layers that represent the image filesystem. +* A configuration file that contains the architecture of the image and other +metadata. +* A manifest file containing the list of all layers and configuration file for +an image. + +All these files are stored in a content-addressable way in which the name of +the file is the result of hashing the file's content. This means that if two +image tags have exactly the same content, DTR only stores the image content +once, even if the tag name is different. + +As an example, if `wordpress:4.8` and `wordpress:latest` have the same content, +they will only be stored once. If you delete one of these tags, the other won't +be deleted. + +This means that when users delete an image tag, DTR can't delete the underlying +files of that image tag since it's possible that there are other tags that +also use the same files. + +To delete unused image layers, DTR: +1. Becomes read-only to make sure that no one is able to push an image, thus +changing the underlying files in the filesystem. +2. Check all the manifest files and keep a record of the files that are +referenced. +3. If a file is never referenced, that means that no image tag uses it, so it +can be safely deleted. + +## Where to go next + +* [Deploy DTR caches](deploy-caches/index.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/license-your-installation.md b/datacenter/dtr/2.4/guides/admin/configure/license-your-installation.md new file mode 100644 index 0000000000..eabe2be0df --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/license-your-installation.md @@ -0,0 +1,39 @@ +--- +title: License your installation +description: Learn how to license your Docker Trusted Registry installation. +keywords: dtr, install, license +--- + +By default, you don't need to license your Docker Trusted Registry. When +installing DTR, it automatically starts using the same license file used on +your Docker Universal Control Plane cluster. + +However, there are some situations when you have to manually license your +DTR installation: + +* When upgrading to a new major version, +* When your current license expires. + + +## Download your license + +Go to [Docker Store](https://store.docker.com/editions/enterprise/docker-ee-trial) +and download your license. + +![](../../images/license-1.png){: .with-border} + + +## License your installation + +Once you've downloaded the license file, you can apply it to your DTR +installation. Navigate to the **DTR web UI**, and then go to the **Settings +page**. + +![](../../images/license-2.png){: .with-border} + +Click the **Apply new license** button, and upload your new license file. + + +## Where to go next + +* [Enable single sign-on](enable-single-sign-on.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/set-up-high-availability.md b/datacenter/dtr/2.4/guides/admin/configure/set-up-high-availability.md new file mode 100644 index 0000000000..626490c048 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/set-up-high-availability.md @@ -0,0 +1,89 @@ +--- +title: Set up high availability +description: Lean how to scale Docker Trusted Registry by adding and removing replicas. +keywords: dtr, install, deploy +--- + +Docker Trusted Registry is designed to scale horizontally as your usage +increases. You can add more replicas to make DTR scale to your demand and for +high availability. + +All DTR replicas run the same set of services and changes to their configuration +are automatically propagated to other replicas. + +![](../../images/set-up-high-availability-1.svg) + +To make DTR tolerant to failures, add additional replicas to the DTR cluster. + +| DTR replicas | Failures tolerated | +|:------------:|:------------------:| +| 1 | 0 | +| 3 | 1 | +| 5 | 2 | +| 7 | 3 | + + +When sizing your DTR installation for high-availability, +follow these rules of thumb: + +* Don't create a DTR cluster with just two replicas. Your cluster +won't tolerate any failures, and it's possible that you experience performance +degradation. +* When a replica fails, the number of failures tolerated by your cluster +decreases. Don't leave that replica offline for long. +* Adding too many replicas to the cluster might also lead to performance +degradation, as data needs to be replicated across all replicas. + +To have high-availability on UCP and DTR, you need a minimum of: + +* 3 dedicated nodes to install UCP with high availability, +* 3 dedicated nodes to install DTR with high availability, +* As many nodes as you want for running your containers and applications. + +## Join more DTR replicas + +To add replicas to an existing DTR deployment: + +1. Use ssh to log into any node that is already part of UCP. + +2. Run the DTR join command: + + ```none + docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} join \ + --ucp-node \ + --ucp-insecure-tls + ``` + + Where the `--ucp-node` is the hostname of the UCP node where you want to + deploy the DTR replica. `--ucp-insecure-tls` tells the command to trust the + certificates used by UCP. + +3. If you have a load balancer, add this DTR replica to the load balancing pool. + +## Remove existing replicas + +To remove a DTR replica from your deployment: + +1. Use ssh to log into any node that is part of UCP. +2. Run the DTR remove command: + +```none +docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} remove \ + --ucp-insecure-tls +``` + +You will be prompted for: + +* Existing replica id: the id of any healthy DTR replica of that cluster +* Replica id: the id of the DTR replica you want to remove. It can be the id of an +unhealthy replica +* UCP username and password: the administrator credentials for UCP + +If you're load-balancing user requests across multiple DTR replicas, don't +forget to remove this replica from the load balancing pool. + +## Where to go next + +* [Set up vulnerability scans](set-up-vulnerability-scans.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/set-up-vulnerability-scans.md b/datacenter/dtr/2.4/guides/admin/configure/set-up-vulnerability-scans.md new file mode 100644 index 0000000000..c35e6ed8dc --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/set-up-vulnerability-scans.md @@ -0,0 +1,186 @@ +--- +title: Set up Security Scanning in DTR +description: Enable and configure Docker Security Scanning for Docker Trusted Registry. +keywords: registry, scanning, security scan, vulnerability, CVE +--- + +This page explains how to set up and enable Docker Security Scanning on an existing installation of Docker Trusted Registry. + +## Prerequisites + +These instructions assume that you have already installed Docker Trusted +Registry, and have access to an account on the DTR instance with administrator +access. + +Before you begin, make sure that you or your organization has purchased a DTR +license that includes Docker Security Scanning, and that your Docker ID can +access and download this license from the Docker Store. + +If you are using a license associated with an individual account, no additional +action is needed. If you are using a license associated with an organization +account, you may need to make sure your Docker ID is a member of the `Owners` +team. Only `Owners` team members can download license files for an Organization. + +If you will be allowing the Security Scanning database to update itself +automatically, make sure that the server hosting your DTR instance can access +`https://dss-cve-updates.docker.com/` on the standard https port 443. + +## Get the security scanning license. + +If your DTR instance already has a license that includes Security Scanning, skip +this step and proceed to [enable DTR Security Scanning](#enable-dtr-security-scanning). + +> **Tip**: To check if your existing DTR license includes scanning, navigate to the DTR **Settings** page, and click **Security**. If an "Enable scanning" toggle appears, the license includes scanning. + +If your current DTR license doesn't include scanning, you must first download the new license. + +1. Log in to the Docker Store using a Docker ID with access to the license you need. +2. In the top right corner, click your user account icon, and select **My Content**. +3. Locate **Docker Enterprise Edition** in the content list, and click **Setup**. +4. Click **License Key** to download the license. + ![](../../images/security-scanning-setup-1.png){: .with-border} + +Next, install the new license on the DTR instance. + +7. Log in to your DTR instance using an administrator account. +8. Click **Settings** in the left navigation. +9. On the **General** tab click **Apply new license**. + + A file browser dialog appears. + +10. Navigate to where you saved the license key (`.lic`) file, select it, and click **Open**. + +![](../../images/security-scanning-setup-2.png){: .with-border} + +Proceed to [enable DTR Security Scanning](#enable-dtr-security-scanning). + +## Enable DTR security scanning + +To enable security scanning in DTR: + +1. Log in to your DTR instance with an administrator account. +2. Click **Settings** in the left navigation. +3. Click the **Security** tab. + + > **Note**: If you see a message on this tab telling you to contact your Docker sales representative, then the license installed on this DTR instance does not include Docker Security Scanning. Check that you have purchased Security Scanning, and that the DTR instance is using the latest license file. + +4. Click the **Enable scanning** toggle so that it turns blue and says "on". + ![](../../images/security-scanning-setup-3.png){: .with-border} +5. Next, provide a security database for the scanner. **Security scanning will not function until DTR has a security database to use.** + + By default, security scanning is enabled in **Online** mode. In this mode, + DTR attempts to download a security database from a Docker server. If your + installation cannot access `https://dss-cve-updates.docker.com/` you must + manually upload a `.tar` file containing the security database. + + - If you are using `Online` mode, the DTR instance will contact a Docker server, download the latest vulnerability database, and install it. Scanning can begin once this process completes. + - If you are using `Offline` mode, use the instructions in [Update scanning database - offline mode](#update-cve-database---offline-mode) to upload an initial security database. + +By default when Security Scanning is enabled, new repositories will automatically scan on `docker push`. If you had existing repositories before you enabled security scanning, you might want to [change repository scanning behavior](#set-repository-scanning-mode). + +## Set repository scanning mode + +Two modes are available when Security Scanning is enabled: + +- `Scan on push & Scan manually`: the image is re-scanned on each `docker push` to the repository, and whenever a user with `write` access clicks the **Start Scan** links or **Scan** button. +- `Scan manually`: the image is scanned only when a user with `write` access clicks the **Start Scan** links or **Scan** button. + +By default, _new_ repositories are set to `Scan on push & Scan manually`, but +you can change this setting during repository creation. + +![](../../images/security-scanning-setup-4.png){: .with-border} + +Any repositories that existed before scanning was enabled are set to `Scan manually` mode by default. If these repositories are still in use, you can change this setting from each repository's **Settings** page. + +> **Note**: To change an individual repository's scanning mode, you must have +`write` or `admin` access to the repo. + +To change an individual repository's scanning mode: + +1. Navigate to the repository, and click the **Settings** tab. +2. Scroll down to the **Image scanning** section. +3. Select the desired scanning mode. +![](../../images/security-scanning-setup-5.png){: .with-border} + +## Update the CVE scanning database + +Docker Security Scanning indexes the components in your DTR images and compares +them against a known CVE database. When new vulnerabilities are reported, Docker +Security Scanning matches the components in new CVE reports to the indexed +components in your images, and quickly generates an updated report. + +Users with administrator access to DTR can check when the CVE database was last updated from the **Security** tab in the DTR **Settings** pages. + +### Update CVE database - online mode + +By default Docker Security Scanning checks automatically for updates to the +vulnerability database, and downloads them when available. If your installation +does not have access to the public internet, use the [Offline mode instructions below](#update-cve-database-offline-mode). + +To ensure that DTR can access these updates, make sure that the host can reach +`https://dss-cve-updates.docker.com/` on port 443 using https. + +DTR checks for new CVE database updates at 3:00 AM UTC every day. If an update +is found it is downloaded and applied without interrupting any scans in +progress. Once the update is complete, the security scanning system looks for +new vulnerabilities in the indexed components. + +To set the update mode to Online: + +1. Log in to DTR as a user with administrator rights. +2. Click **Settings** in the left navigation and click **Security**. +3. Click **Online**. + +Your choice is saved automatically. + +> **Tip**: DTR also checks for CVE database updates when scanning is first enabled, and when you switch update modes. If you need to check for a CVE database update immediately, you can briefly switch modes from online to offline and back again. + +### Update CVE database - offline mode + +To update the CVE database for your DTR instance when it cannot contact the update server, you download and install a `.tar` file that contains the database updates. To download the file: + +1. Log in to the [Docker Store](https://store.docker.com/). + + If you are a member of an Organization managing licenses using Docker Store, + make sure your account is a member of the `Owners` team. Only Owners can + view and manage licenses and other entitlements for Organizations from the + Docker Store. + +2. In the top right corner, click your user account icon, and select **My Content**. +3. If necessary, select an organization account from the **Accounts** menu at the upper right. +4. Locate your Docker EE Advanced subscription or trial. +5. Click **Setup** button. + + ![](../../images/security-scanning-setup-6.png){: .with-border} + +6. Click **Download CVE Vulnerability Database** link to download the database file. + + ![](../../images/security-scanning-setup-7.png){: .with-border} + + If you run into problems, contact us at nautilus-feedback@docker.com for the file. + +To manually update the DTR CVE database from a `.tar` file: + +1. Log in to DTR as a user with administrator rights. +2. Click **Settings** in the left navigation and click **Security**. +4. Click **Upload .tar database file**. +5. Browse to the latest `.tar` file that you received, and click **Open**. + +DTR installs the new CVE database, and begins checking already indexed images +for components that match new or updated vulnerabilities. + +> **Tip**: The Upload button is unavailable while DTR applies CVE database updates. + +## Enable or disable automatic database updates + +To change the update mode: + +1. Log in to DTR as a user with administrator rights. +2. Click **Settings** in the left navigation and click **Security**. +3. Click **Online/Offline**. + +Your choice is saved automatically. + +## Where to go next + +* [Deploy DTR caches](deploy-caches/index.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/use-a-load-balancer.md b/datacenter/dtr/2.4/guides/admin/configure/use-a-load-balancer.md new file mode 100644 index 0000000000..181e82097b --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/use-a-load-balancer.md @@ -0,0 +1,290 @@ +--- +title: Use a load balancer +description: Learn how to configure a load balancer to balance user requests across multiple Docker Trusted Registry replicas. +keywords: dtr, load balancer +--- + +Once you’ve joined multiple DTR replicas nodes for +[high-availability](set-up-high-availability.md), you can configure your own +load balancer to balance user requests across all replicas. + +![](../../images/use-a-load-balancer-1.svg) + + +This allows users to access DTR using a centralized domain name. If a replica +goes down, the load balancer can detect that and stop forwarding requests to +it, so that the failure goes unnoticed by users. + +## Load balancing DTR + +DTR does not provide a load balancing service. You can use an on-premises +or cloud-based load balancer to balance requests across multiple DTR replicas. + +Make sure you configure your load balancer to: + +* Load balance TCP traffic on ports 80 and 443 +* Make sure the load balancer is not buffering requests +* Make sure the load balancer is forwarding the `Host` HTTP header correctly +* Make sure there's no timeout for idle connections, or set it to more than 10 minutes +* Use the unauthenticated `/_ping` endpoint (note the lack of an `/api/v0/` in +the path) on each DTR replica, to check if the replica is healthy and if it +should remain in the load balancing pool or not + +## Health check endpoints + +The `/_ping` endpoint returns a JSON object for the replica being queried of +the form: + +```json +{ + "Error": "error message", + "Healthy": true +} +``` + +A response of `"Healthy": true` means the replica is suitable for taking +requests. It is also sufficient to check whether the HTTP status code is 200. + +An unhealthy replica will return 503 as the status code and populate `"Error"` +with more details on any one of these services: + +* Storage container (registry) +* Authorization (garant) +* Metadata persistence (rethinkdb) +* Content trust (notary) + +Note that this endpoint is for checking the health of a *single* replica. To get +the health of every replica in a cluster, querying each replica individiually is +the preferred way to do it in real time. + +The `/api/v0/meta/cluster_status` +[endpoint](../../../reference/api) +returns a JSON object for the entire cluster *as observed* by the replica being +queried, and it takes the form: + +```json +{ + "replica_health": { + "replica id": "OK", + "another replica id": "error message" + }, + "replica_timestamp": { + "replica id": "2006-01-02T15:04:05Z07:00", + "another replica id": "2006-01-02T15:04:05Z07:00" + }, + "(other fields go here)": "..." +} +``` + +Health statuses for the replicas is available in the `"replica_health"` object. +These statuses are taken from a cache which is last updated by each replica +individually at the time specified in the `"replica_timestamp"` object. + +The response also contains information about the internal DTR storage state, +which is around 45 KB of data. This, combined with the fact that the endpoint +requires admin credentials, means it is not particularly appropriate for load +balance checks. Use `/_ping` instead for those kinds of checks. + + +## Configuration examples + +Use the following examples to configure your load balancer for DTR. + + +
+
+```conf +user nginx; +worker_processes 1; + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +stream { + upstream dtr_80 { + server :80 max_fails=2 fail_timeout=30s; + server :80 max_fails=2 fail_timeout=30s; + server :80 max_fails=2 fail_timeout=30s; + } + upstream dtr_443 { + server :443 max_fails=2 fail_timeout=30s; + server :443 max_fails=2 fail_timeout=30s; + server :443 max_fails=2 fail_timeout=30s; + } + server { + listen 443; + proxy_pass dtr_443; + } + + server { + listen 80; + proxy_pass dtr_80; + } +} +``` +
+
+```conf +global + log /dev/log local0 + log /dev/log local1 notice + +defaults + mode tcp + option dontlognull + timeout connect 5000 + timeout client 50000 + timeout server 50000 +### frontends +# Optional HAProxy Stats Page accessible at http://:8181/haproxy?stats +frontend dtr_stats + mode http + bind 0.0.0.0:8181 + default_backend dtr_stats +frontend dtr_80 + mode tcp + bind 0.0.0.0:80 + default_backend dtr_upstream_servers_80 +frontend dtr_443 + mode tcp + bind 0.0.0.0:443 + default_backend dtr_upstream_servers_443 +### backends +backend dtr_stats + mode http + option httplog + stats enable + stats admin if TRUE + stats refresh 5m +backend dtr_upstream_servers_80 + mode tcp + option httpchk GET /_ping HTTP/1.1\r\nHost:\ + server node01 :80 check weight 100 + server node02 :80 check weight 100 + server node03 :80 check weight 100 +backend dtr_upstream_servers_443 + mode tcp + option httpchk GET /_ping HTTP/1.1\r\nHost:\ + server node01 :443 weight 100 check check-ssl verify none + server node02 :443 weight 100 check check-ssl verify none + server node03 :443 weight 100 check check-ssl verify none +``` +
+
+```json +{ + "Subnets": [ + "subnet-XXXXXXXX", + "subnet-YYYYYYYY", + "subnet-ZZZZZZZZ" + ], + "CanonicalHostedZoneNameID": "XXXXXXXXXXX", + "CanonicalHostedZoneName": "XXXXXXXXX.us-west-XXX.elb.amazonaws.com", + "ListenerDescriptions": [ + { + "Listener": { + "InstancePort": 443, + "LoadBalancerPort": 443, + "Protocol": "TCP", + "InstanceProtocol": "TCP" + }, + "PolicyNames": [] + } + ], + "HealthCheck": { + "HealthyThreshold": 2, + "Interval": 10, + "Target": "HTTPS:443/_ping", + "Timeout": 2, + "UnhealthyThreshold": 4 + }, + "VPCId": "vpc-XXXXXX", + "BackendServerDescriptions": [], + "Instances": [ + { + "InstanceId": "i-XXXXXXXXX" + }, + { + "InstanceId": "i-XXXXXXXXX" + }, + { + "InstanceId": "i-XXXXXXXXX" + } + ], + "DNSName": "XXXXXXXXXXXX.us-west-2.elb.amazonaws.com", + "SecurityGroups": [ + "sg-XXXXXXXXX" + ], + "Policies": { + "LBCookieStickinessPolicies": [], + "AppCookieStickinessPolicies": [], + "OtherPolicies": [] + }, + "LoadBalancerName": "ELB-DTR", + "CreatedTime": "2017-02-13T21:40:15.400Z", + "AvailabilityZones": [ + "us-west-2c", + "us-west-2a", + "us-west-2b" + ], + "Scheme": "internet-facing", + "SourceSecurityGroup": { + "OwnerAlias": "XXXXXXXXXXXX", + "GroupName": "XXXXXXXXXXXX" + } +} +``` +
+
+ + +You can deploy your load balancer using: + + +
+
+```conf +# Create the nginx.conf file, then +# deploy the load balancer + +docker run --detach \ + --name dtr-lb \ + --restart=unless-stopped \ + --publish 80:80 \ + --publish 443:443 \ + --volume ${PWD}/nginx.conf:/etc/nginx/nginx.conf:ro \ + nginx:stable-alpine +``` +
+
+```conf +# Create the haproxy.cfg file, then +# deploy the load balancer + +docker run --detach \ + --name dtr-lb \ + --publish 443:443 \ + --publish 80:80 \ + --publish 8181:8181 \ + --restart=unless-stopped \ + --volume ${PWD}/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro \ + haproxy:1.7-alpine haproxy -d -f /usr/local/etc/haproxy/haproxy.cfg +``` +
+
+ +## Where to go next + +* [Backups and disaster recovery](../backups-and-disaster-recovery.md) +* [DTR architecture](../../architecture.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/use-a-web-proxy.md b/datacenter/dtr/2.4/guides/admin/configure/use-a-web-proxy.md new file mode 100644 index 0000000000..5b60e8703b --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/use-a-web-proxy.md @@ -0,0 +1,33 @@ +--- +title: Use a web proxy +description: Learn how to configure Docker Content Trust to use a web proxy to + reach external services. +keywords: dtr, configure, http, proxy +--- + +Docker Trusted Registry makes outgoing connections to check for new versions, +automatically renew its license, and update its vulnerability database. +If DTR can't access the internet, then you'll have to manually apply updates. + +One option to keep your environment secure while still allowing DTR access to +the internet is to use a web proxy. If you have an HTTP or HTTPS proxy, you +can configure DTR to use it. To avoid downtime you should do this configuration +outside business peak hours. + +As an administrator, log into a node where DTR is deployed, and run: + +``` +docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} reconfigure \ + --http-proxy http://: \ + --https-proxy https://: \ + --ucp-insecure-tls +``` + +To confirm how DTR is configured, check the **Settings** page on the web UI. + +![DTR settings](../../images/use-a-web-proxy-1.png){: .with-border} + +## Where to go next + +* [Configure garbage collection](garbage-collection.md) diff --git a/datacenter/dtr/2.4/guides/admin/configure/use-your-own-tls-certificates.md b/datacenter/dtr/2.4/guides/admin/configure/use-your-own-tls-certificates.md new file mode 100644 index 0000000000..5bfddcf985 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/configure/use-your-own-tls-certificates.md @@ -0,0 +1,45 @@ +--- +title: Use your own TLS certificates +description: Learn how to configure Docker Trusted Registry with your own TLS certificates. +keywords: dtr, tls +--- + + +By default the DTR services are exposed using HTTPS, to ensure all +communications between clients and DTR is encrypted. Since DTR +replicas use self-signed certificates for this, when a client accesses +DTR, their browsers won't trust this certificate, so the browser displays a +warning message. + +You can configure DTR to use your own certificates, so that it is automatically +trusted by your users' browser and client tools. + +## Replace the server certificates + +To configure DTR to use your own certificates and keys, go to the +**DTR web UI**, navigate to the **Settings** page, and scroll down to the +**Domain** section. + +![](../../images/use-your-certificates-1.png){: .with-border} + + +Set the DTR domain name and upload the certificates and key: + +* Load balancer/public address, is the domain name clients will use to access DTR. +* TLS certificate, is the server certificate and any intermediate CA public +certificates. This certificate needs to be valid for the DTR public address, +and have SANs for all addresses used to reach the DTR replicas, including load +balancers. +* TLS private key is the server private key. +* TLS CA is the root CA public certificate. + +Finally, click **Save** for the changes to take effect. + +If you're using certificates issued by a globally trusted certificate authority, +any web browser or client tool should now trust DTR. If you're using an internal +certificate authority, you'll need to configure your system to trust that +certificate authority. + +## Where to go next + +* [Set up external storage](external-storage/index.md) diff --git a/datacenter/dtr/2.4/guides/admin/install/index.md b/datacenter/dtr/2.4/guides/admin/install/index.md new file mode 100644 index 0000000000..9f1f9afcfe --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/install/index.md @@ -0,0 +1,131 @@ +--- +title: Install Docker Trusted Registry +description: Learn how to install Docker Trusted Registry for production. +keywords: dtr, registry, install +--- + +Docker Trusted Registry (DTR) is a containerized application that runs on a +swarm managed by Docker Universal Control Plane (UCP). It can be installed +on-premises or on a cloud infrastructure. + +Use these instructions to install DTR. + +## Step 1. Validate the system requirements + +The first step in installing DTR, is ensuring your +infrastructure has all the [requirements DTR needs to run](system-requirements.md). + +## Step 2. Install UCP + +Since DTR requires Docker Universal Control Plane (UCP) +to run, you need to install UCP on all the nodes where you plan to install DTR. +[Learn how to install UCP](/datacenter/ucp/2.2/guides/admin/install.md). + +DTR needs to be installed on a worker node that is being managed by UCP. +You can't install DTR on a standalone Docker Engine. + +![](../../images/install-dtr-1.svg) + + +## Step 3. Install DTR + +Once UCP is installed, navigate to the **UCP web UI**. In the **Admin Settings**, +choose **Docker Trusted Registry**. + +![](../../images/install-dtr-2.png){: .with-border} + +After you configure all the options, you'll have a snippet that you can use +to deploy DTR. It should look like this: + +```none +# Pull the latest version of DTR +$ docker pull {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} + +# Install DTR +$ docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} install \ + --ucp-node \ + --ucp-insecure-tls +``` + +You can run that snippet on any node where Docker is installed. As an example +you can SSH into a UCP node and run the DTR installer from there. By default +the installer runs in interactive mode and prompts you for any additional +information that is necessary. +[Learn more about the installer](../../../reference/cli/install.md). + +## Step 4. Check that DTR is running + +In your browser, navigate to the Docker **Universal Control Plane** +web UI, and navigate to the **Applications** screen. DTR should be listed +as an application. + +![](../../images/install-dtr-3.png){: .with-border} + +You can also access the **DTR web UI**, to make sure it is working. In your +browser, navigate to the address where you installed DTR. + +![](../../images/install-dtr-4.png){: .with-border} + + +## Step 5. Configure DTR + +After installing DTR, you should configure: + + * The certificates used for TLS communication. [Learn more](../configure/use-your-own-tls-certificates.md). + * The storage backend to store the Docker images. [Lean more](../configure/external-storage/index.md). + + To perform these configurations, navigate to the **Settings** page of DTR. + + ![](../../images/install-dtr-5.png){: .with-border} + + +## Step 6. Test pushing and pulling + +Now that you have a working installation of DTR, you should test that you can +push and pull images to it. +[Learn how to push and pull images](../../user/manage-images/pull-and-push-images.md). + +## Step 7. Join replicas to the cluster + +This step is optional. + +To set up DTR for high availability, +you can add more replicas to your DTR cluster. Adding more replicas allows you +to load-balance requests across all replicas, and keep DTR working if a +replica fails. + +For high-availability you should set 3, 5, or 7 DTR replicas. The nodes where +you're going to install these replicas also need to be managed by UCP. + +To add replicas to a DTR cluster, use the `docker/dtr join` command: + +1. Load your UCP user bundle. + +2. Run the join command. + + When you join a replica to a DTR cluster, you need to specify the + ID of a replica that is already part of the cluster. You can find an + existing replica ID by going to the **Applications** page on UCP. + + Then run: + + ```none + docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} join \ + --ucp-node \ + --ucp-insecure-tls + ``` + +3. Check that all replicas are running. + + In your browser, navigate to the Docker **Universal Control Plane** + web UI, and navigate to the **Applications** screen. All replicas should + be displayed. + + ![](../../images/install-dtr-6.png){: .with-border} + +## See also + +* [Install DTR offline](install-offline.md) +* [Upgrade DTR](../upgrade.md) diff --git a/datacenter/dtr/2.4/guides/admin/install/install-offline.md b/datacenter/dtr/2.4/guides/admin/install/install-offline.md new file mode 100644 index 0000000000..e95e1d81de --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/install/install-offline.md @@ -0,0 +1,70 @@ +--- +title: Install Docker Trusted Registry offline +description: Learn how to install Docker Trusted Registry on a machine with no internet + access. +keywords: registry, install, offline +--- + +The procedure to install Docker Trusted Registry on a host is the same, +whether that host has access to the internet or not. + +The only difference when installing on an offline host, +is that instead of pulling the UCP images from Docker Hub, you use a +computer that is connected to the internet to download a single package with +all the images. Then you copy that package to the host where you’ll install DTR. + +## Versions available + +{% include components/ddc_url_list_2.html product="dtr" version="2.4" %} + +## Download the offline package + +Use a computer with internet access to download a package with all DTR images: + +```bash +$ wget -O dtr.tar.gz +``` + +Now that you have the package in your local machine, you can transfer it to +the machines where you want to install DTR. + +For each machine where you want to install DTR: + +1. Copy the DTR package to that machine. + + ```bash + $ scp dtr.tar.gz @ + ``` + +2. Use ssh to log into the hosts where you transferred the package. + +3. Load the DTR images. + + Once the package is transferred to the hosts, you can use the + `docker load` command to load the Docker images from the tar archive: + + ```bash + $ docker load < dtr.tar.gz + ``` + +## Install DTR + +Now that the offline hosts have all the images needed to install DTR, +you can [install DTR on that host](index.md). + +### Preventing outgoing connections + +DTR makes outgoing connections to: + +* report analytics, +* check for new versions, +* check online licenses, +* update the vulnerability scanning database + +All of these uses of online connections are optional. You can choose to +disable or not use any or all of these features on the admin settings page. + +## Where to go next + +* [DTR architecture](../../architecture.md) +* [Install DTR](index.md) diff --git a/datacenter/dtr/2.4/guides/admin/install/system-requirements.md b/datacenter/dtr/2.4/guides/admin/install/system-requirements.md new file mode 100644 index 0000000000..84be685766 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/install/system-requirements.md @@ -0,0 +1,42 @@ +--- +title: Docker Trusted Registry system requirements +description: Learn about the system requirements for installing Docker Trusted Registry. +keywords: DTR, architecture, requirements +--- + +Docker Trusted Registry can be installed on-premises or on the cloud. +Before installing, be sure your infrastructure has these requirements. + +## Software requirements + +You can install DTR on-premises or on a cloud provider. To install DTR, +all nodes must: +* Be a worker node managed by Universal Control Plane. +* Have a fixed hostname. + +## Ports used + +When installing DTR on a node, make sure the following ports are open on that +node: + +| Direction | Port | Purpose | +|:---------:|:--------|:--------------------------------------| +| in | 80/tcp | Web app and API client access to DTR. | +| in | 443/tcp | Web app and API client access to DTR. | + +These ports are configurable when installing DTR. + +## Compatibility and maintenance lifecycle + +Docker Enterprise Edition is a software subscription that includes three products: + +* Docker Engine EE, +* Docker Trusted Registry, +* Docker Universal Control Plane. + +[Learn more about the maintenance lifecycle for these products](http://success.docker.com/Get_Help/Compatibility_Matrix_and_Maintenance_Lifecycle). + +## Where to go next + +* [DTR architecture](../../architecture.md) +* [Install DTR](index.md) diff --git a/datacenter/dtr/2.4/guides/admin/install/uninstall.md b/datacenter/dtr/2.4/guides/admin/install/uninstall.md new file mode 100644 index 0000000000..e4228df28b --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/install/uninstall.md @@ -0,0 +1,25 @@ +--- +title: Uninstall Docker Trusted Registry +description: Learn how to uninstall your Docker Trusted Registry installation. +keywords: dtr, install, uninstall +--- + +Uninstalling DTR can be done by simply removing all data associated with each +replica. To do that, you just run the destroy command once per replica: + +```none +docker run -it --rm \ + docker/dtr:{{ page.dtr_version }} destroy \ + --ucp-insecure-tls +``` + +You will be prompted for the UCP URL, UCP credentials, and which replica to +destroy. + +To see what options are available in the destroy command, check the +[destroy command reference documentation](../../../reference/cli/destroy.md). + +## Where to go next + +* [Scale your deployment](../configure/set-up-high-availability.md) +* [Install DTR](index.md) diff --git a/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-orgs.md b/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-orgs.md new file mode 100644 index 0000000000..1e811e74eb --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-orgs.md @@ -0,0 +1,47 @@ +--- +title: Create and manage organizations +description: Learn how to set up organizations to enforce security in Docker Trusted + Registry. +keywords: registry, security, permissions, organizations +--- + +When a user creates a repository, only that user has permissions to make changes +to the repository. + +For team workflows, where multiple users have permissions to manage a set of +common repositories, create an organization. By default, DTR has one +organization called 'docker-datacenter', that is shared between DTR and UCP. + +To create a new organization, navigate to the **DTR web UI**, and go to the +**Organizations** page. + +![](../../images/create-and-manage-orgs-1.png){: .with-border} + +Click the **New organization** button, and choose a meaningful name for the +organization. + +![](../../images/create-and-manage-orgs-2.png){: .with-border} + +Repositories owned by this organization will contain the organization name, so +to pull an image from that repository, you'll use: + +```bash +$ docker pull //: +``` + +Click **Save** to create the organization, and then **click the organization** +to define which users are allowed to manage this +organization. These users will be able to edit the organization settings, edit +all repositories owned by the organization, and define the user permissions for +this organization. + +For this, click the **Add user** button, **select the users** that you want to +grant permissions to manage the organization, and click +**Save**. Then change their permissions from 'Member' to **Admin**. + +![](../../images/create-and-manage-orgs-3.png){: .with-border} + +## Where to go next + +* [Create and manage users](create-and-manage-users.md) +* [Create and manage teams](create-and-manage-teams.md) diff --git a/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-teams.md b/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-teams.md new file mode 100644 index 0000000000..18ee0e5f97 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-teams.md @@ -0,0 +1,55 @@ +--- +title: Create and manage teams in DTR +description: Learn how to manage teams to enforce fine-grain access control in Docker + Trusted Registry. +keywords: registry, security, permissions, teams +--- + +You can extend a user's default permissions by granting them individual +permissions in other image repositories, by adding the user to a team. A team +defines the permissions a set of users have for a set of repositories. + +To create a new team, go to the **DTR web UI**, and navigate to the +**Organizations** page. +Then **click the organization** where you want to create the team. In this +example, we'll create the 'billing' team under the 'whale' organization. + +![](../../images/create-and-manage-teams-1.png){: .with-border} + +Click '**+**' to create a new team, and give it a name. + +![](../../images/create-and-manage-teams-2.png){: .with-border} + +## Add users to a team + +Once you have created a team, **click the team** name, to manage its settings. +The first thing we need to do is add users to the team. Click the **Add user** +button and add users to the team. + +![](../../images/create-and-manage-teams-3.png){: .with-border} + +## Manage team permissions + +The next step is to define the permissions this team has for a set of +repositories. Navigate to the **Repositories** tab, and click the +**Add repository** button. + +![](../../images/create-and-manage-teams-4.png){: .with-border} + +Choose the repositories this team has access to, and what permission levels the +team members have. + +![](../../images/create-and-manage-teams-5.png){: .with-border} + +There are three permission levels available: + +| Permission level | Description | +|:-----------------|:-----------------------------------------------------------------| +| Read only | View repository and pull images. | +| Read & Write | View repository, pull and push images. | +| Admin | Manage repository and change its settings, pull and push images. | + +## Where to go next + +* [Create and manage users](create-and-manage-users.md) +* [Permission levels](permission-levels.md) diff --git a/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-users.md b/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-users.md new file mode 100644 index 0000000000..34799b07fe --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/manage-users/create-and-manage-users.md @@ -0,0 +1,28 @@ +--- +title: Create and manage users in DTR +description: Learn how to manage user permissions in Docker Trusted Registry. +keywords: registry, security, permissions, users +--- + +When using the built-in authentication, you can create users +to grant them fine-grained permissions. +Users are shared across UCP and DTR. When you create a new user in +Docker Universal Control Plane, that user becomes available in DTR and vice +versa. + +To create a new user, go to the **DTR web UI**, and navigate to the **Users** +page. + +![](../../images/create-manage-users-1.png){: .with-border} + +Click the **New user** button, and fill-in the user information. + +![](../../images/create-manage-users-2.png){: .with-border} + +Check the **Trusted Registry admin** option, if you want to grant permissions +for the user to be a UCP and DTR administrator. + +## Where to go next + +* [Authentication and authorization](index.md) +* [Create and manage teams](create-and-manage-teams.md) diff --git a/datacenter/dtr/2.4/guides/admin/manage-users/index.md b/datacenter/dtr/2.4/guides/admin/manage-users/index.md new file mode 100644 index 0000000000..0d02ca49e2 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/manage-users/index.md @@ -0,0 +1,56 @@ +--- +title: Authentication and authorization in DTR +description: Learn about the permission levels available on Docker Trusted Registry. +keywords: registry, security, permissions, users +--- + +With DTR you get to control which users have access to your image repositories. + +By default, anonymous users can only pull images from public repositories. +They can't create new repositories or push to existing ones. +You can then grant permissions to enforce fine-grained access control to image +repositories. For that: + +* Start by creating a user. + + Users are shared across UCP and DTR. When you create a new user in + Docker Universal Control Plane, that user becomes available in DTR and vice + versa. Registered users can create and manage their own repositories. + + You can also integrate with an LDAP service to manage users from a single + place. + +* Extend the permissions by adding the user to a team. + + To extend a user's permission and manage their permissions over repositories, + you add the user to a team. + A team defines the permissions users have for a set of repositories. + + +## Organizations and teams + +When a user creates a repository, only that user can make changes to the +repository settings, and push new images to it. + +Organizations take permission management one step further, since they allow +multiple users to own and manage a common set of repositories. This +is useful when implementing team workflows. With organizations you can +delegate the management of a set of repositories and user permissions to the +organization administrators. + +An organization owns a set of repositories, and defines a set of teams. With +teams you can define fine-grain permissions that a team of +user has for a set of repositories. + +![](../../images/authentication-authorization-1.svg) + +In this example, the 'Whale' organization has three repositories and two teams: + +* Members of the blog team can only see and pull images from the whale/java +repository, +* Members of the billing team can manage the whale/golang repository, and push +and pull images from the whale/java repository. + +## Where to go next + +* [Create and manage users](create-and-manage-users.md) diff --git a/datacenter/dtr/2.4/guides/admin/manage-users/permission-levels.md b/datacenter/dtr/2.4/guides/admin/manage-users/permission-levels.md new file mode 100644 index 0000000000..6ce70e8da3 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/manage-users/permission-levels.md @@ -0,0 +1,54 @@ +--- +title: Permission levels in DTR +description: Learn about the permission levels available in Docker Trusted Registry. +keywords: registry, security, permissions +--- + +Docker Trusted Registry allows you to define fine-grain permissions over image +repositories. + +## Administrator users + +Users are shared across UCP and DTR. When you create a new user in Docker +Universal Control Plane, that user becomes available in DTR and vice versa. +When you create an administrator user in DTR, the user has permissions to: + +* Manage users across UCP and DTR, +* Manage DTR repositories and settings, +* Manage UCP resources and settings. + +## Team permission levels + +Teams allow you to define the permissions a set of user has for a set of +repositories. Three permission levels are available: + +| Repository operation | read | read-write | admin | +|:----------------------|:----:|:----------:|:-----:| +| View/ browse | x | x | x | +| Pull | x | x | x | +| Push | | x | x | +| Start a scan | | x | x | +| Delete tags | | x | x | +| Edit description | | | x | +| Set public or private | | | x | +| Manage user access | | | x | +| Delete repository | | | x | + +Team permissions are additive. When a user is a member of multiple teams, they +have the highest permission level defined by those teams. + +## Overall permissions + +Here's an overview of the permission levels available in DTR: + +* Anonymous users: Can search and pull public repositories. +* Users: Can search and pull public repos, and create and manage their own +repositories. +* Team member: Everything a user can do, plus the permissions granted by the teams the user is member of. +* Team admin: Everything a team member can do, and can also add members to the team. +* Organization admin: Everything a team admin can do, can create new teams, and add members to the organization. +* Admin: Can manage anything across UCP and DTR. + +## Where to go next + +* [Authentication and authorization](index.md) diff --git a/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/index.md b/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/index.md new file mode 100644 index 0000000000..f04826a346 --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/index.md @@ -0,0 +1,44 @@ +--- +title: Monitor Docker Trusted Registry +description: Learn how to monitor your DTR installation. +keywords: registry, monitor, troubleshoot +--- + +Docker Trusted Registry is a Dockerized application. To monitor it, you can +use the same tools and techniques you're already using to monitor other +containerized applications running on your cluster. One way to monitor +DTR is using the monitoring capabilities of Docker Universal Control Plane. + +In your browser, log in to **Docker Universal Control Plane** (UCP), and +navigate to the **Stacks** page. +If you have DTR set up for high-availability, then all the DTR replicas are +displayed. + +![](../../images/monitor-1.png){: .with-border} + +To check the containers for the DTR replica, **click the replica** you want +to inspect, click **Inspect Resource**, and choose **Containers**. + +![](../../images/monitor-2.png){: .with-border} + +Now you can drill into each DTR container to see its logs and find the root +cause of the problem. + +![](../../images/monitor-3.png){: .with-border} + +## Health checks + +DTR also exposes several endpoints you can use to assess if a DTR replica +is healthy or not: + +* `/_ping`: Checks if the DTR replica is healthy, and +returns a simple json response. This is useful for load balancing or other +automated health check tasks. +* `/nginx_status`: Returns the number of connections being handled by the +NGINX front-end used by DTR. +* `/api/v0/meta/cluster_status`: Returns extensive information about all DTR +replicas. + +## Where to go next + +* [Troubleshoot with logs](troubleshoot-with-logs.md) diff --git a/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/troubleshoot-batch-jobs.md b/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/troubleshoot-batch-jobs.md new file mode 100644 index 0000000000..f3beb8811e --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/troubleshoot-batch-jobs.md @@ -0,0 +1,232 @@ +--- +title: Troubleshoot batch jobs +description: Learn how Docker Trusted Registry run batch jobs, so that you can troubleshoot when something goes wrong +keywords: dtr, troubleshoot +--- + +DTR uses a job queue to schedule batch jobs. A job is placed on this work queue, +and a job runner component of DTR consumes work from this cluster-wide job +queue and executes it. + +![batch jobs diagram](../../images/troubleshoot-batch-jobs-1.svg) + +All DTR replicas have access to the job queue, and have a job runner component +that can get and execute work. + +## How it works + +When a job is created, it is added to a cluster-wide job queue with the +`waiting` status. +When one of the DTR replicas is ready to claim, it waits a random time of up +to 3 seconds, giving the opportunity to every replica to claim the task. + +A replica gets a job by adding it's replica ID to the job. That way, other +replicas know the job has been claimed. Once a replica claims a job it adds +it to an internal queue of jobs, that is sorted by their `scheduledAt` time. +When that time happens, the replica updates the job status to `running`, and +starts executing it. + +The job runner component of each DTR replica keeps an `heartbeatExpiration` +entry on the database shared by all replicas. If a replica becomes +unhealthy, other replicas notice this and update that worker status to `dead`. +Also, all the jobs that replica had claimed are updated to the status `worker_dead`, +so that other replicas can claim the job. + +## Job types + +DTR has several types of jobs. + +| Job | Description | +|:------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| gc | Garbage collection job that deletes layers associated with deleted images | +| sleep | Sleep is used to test the correctness of the jobrunner. It sleeps for 60 seconds | +| false | False is used to test the correctness of the jobrunner. It runs the `false` command and immediately fails | +| tagmigration | Tag migration is used to synchronize tag and manifest information between the DTR database and the storage backend. | +| bloblinkmigration | bloblinkmigration is a 2.1 to 2.1 upgrade process that adds references for blobs to repositories in the database | +| license_update | License update checks for license expiration extensions if online license updates are enabled | +| scan_check | An image security scanning job. This job does not perform the actual scanning, rather it spawns `scan_check_single` jobs (one for each layer in the image). Once all of the `scan_check_single` jobs are complete, this job will terminate | +| scan_check_single | A security scanning job for a particular layer given by the `parameter: SHA256SUM`. This job breaks up the layer into components and checks each component for vulnerabilities | +| scan_check_all | A security scanning job that updates all of the currently scanned images to display the latest vulnerabilities | +| update_vuln_db | A job that is created to update DTR's vulnerability database. It uses an Internet connection to check for database updates through `https://dss-cve-updates.docker.com/` and updates the `dtr-scanningstore` container if there is a new update available | +| webhook | A job that is used to dispatch a webhook payload to a single endpoint | + +## Job status + +Jobs can be in one of the following status: + +| Status | Description | +|:----------------|:------------------------------------------------------------------------------------------------------------------------------------------| +| waiting | The job is unclaimed and waiting to be picked up by a worker | +| running | The worker defined by `workerID` is currently running the job | +| done | The job has successfully completed | +| error | The job has completed with errors | +| cancel_request | The worker monitors the job statuses in the database. If the status for a job changes to `cancel_request`, the worker will cancel the job | +| cancel | The job has been cancelled and not fully executed | +| deleted | The job and logs have been removed | +| worker_dead | The worker for this job has been declared `dead` and the job will not continue | +| worker_shutdown | The worker that was running this job has been gracefully stopped | +| worker | resurrection| The worker for this job has reconnected to the database and will cancel these jobs | + +## Job capacity + +Each job runner has a limited capacity and won't claim jobs that require an +higher capacity. You can see the capacity of a job runner using the +`GET /api/v0/workers` endpoint: + +```json +{ + "workers": [ + { + "id": "000000000000", + "status": "running", + "capacityMap": { + "scan": 1, + "scanCheck": 1 + }, + "heartbeatExpiration": "2017-02-18T00:51:02Z" + } + ] +} +``` + +This means that the worker with replica ID `000000000000` has a capacity of 1 +`scan` and 1 `scanCheck`. If this worker notices that the following jobs +are available: + +```json +{ + "jobs": [ + { + "id": "0", + "workerID": "", + "status": "waiting", + "capacityMap": { + "scan": 1 + } + }, + { + "id": "1", + "workerID": "", + "status": "waiting", + "capacityMap": { + "scan": 1 + } + }, + { + "id": "2", + "workerID": "", + "status": "waiting", + "capacityMap": { + "scanCheck": 1 + } + } + ] +} +``` + +Our worker will be able to pick up job id `0` and `2` since it has the capacity +for both, while id `1` will have to wait until the previous scan job is complete: + +```json +{ + "jobs": [ + { + "id": "0", + "workerID": "000000000000", + "status": "running", + "capacityMap": { + "scan": 1 + } + }, + { + "id": "1", + "workerID": "", + "status": "waiting", + "capacityMap": { + "scan": 1 + } + }, + { + "id": "2", + "workerID": "000000000000", + "status": "running", + "capacityMap": { + "scanCheck": 1 + } + } + ] +} +``` + +## Troubleshoot jobs + +You can get the list of jobs, using the `GET /api/v0/jobs/` endpoint. Each job +looks like this: + +```json +{ + "id": "1fcf4c0f-ff3b-471a-8839-5dcb631b2f7b", + "retryFromID": "1fcf4c0f-ff3b-471a-8839-5dcb631b2f7b", + "workerID": "000000000000", + "status": "done", + "scheduledAt": "2017-02-17T01:09:47.771Z", + "lastUpdated": "2017-02-17T01:10:14.117Z", + "action": "scan_check_single", + "retriesLeft": 0, + "retriesTotal": 0, + "capacityMap": { + "scan": 1 + }, + "parameters": { + "SHA256SUM": "1bacd3c8ccb1f15609a10bd4a403831d0ec0b354438ddbf644c95c5d54f8eb13" + }, + "deadline": "", + "stopTimeout": "" +} +``` + +The fields of interest here are: + +* `id`: the ID of the job +* `workerID`: the ID of the worker in a DTR replica that is running this job +* `status`: the current state of the job +* `action`: what job the worker will actually perform +* `capacityMap`: the available capacity a worker needs for this job to run + + +## Cron jobs + +Several of the jobs performed by DTR are run in a recurrent schedule. You can +see those jobs using the `GET /api/v0/crons` endpoint: + + +```json +{ + "crons": [ + { + "id": "48875b1b-5006-48f5-9f3c-af9fbdd82255", + "action": "license_update", + "schedule": "57 54 3 * * *", + "retries": 2, + "capacityMap": null, + "parameters": null, + "deadline": "", + "stopTimeout": "", + "nextRun": "2017-02-22T03:54:57Z" + }, + { + "id": "b1c1e61e-1e74-4677-8e4a-2a7dacefffdc", + "action": "update_db", + "schedule": "0 0 3 * * *", + "retries": 0, + "capacityMap": null, + "parameters": null, + "deadline": "", + "stopTimeout": "", + "nextRun": "2017-02-22T03:00:00Z" + } + ] +} +``` + +The `schedule` uses a Unix crontab syntax. diff --git a/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/troubleshoot-with-logs.md b/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/troubleshoot-with-logs.md new file mode 100644 index 0000000000..731ddd987a --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/monitor-and-troubleshoot/troubleshoot-with-logs.md @@ -0,0 +1,135 @@ +--- +title: Troubleshoot Docker Trusted Registry +description: Learn how to troubleshoot your DTR installation. +keywords: registry, monitor, troubleshoot +--- + +This guide contains tips and tricks for troubleshooting DTR problems. + +## Troubleshoot overlay networks + +High availability in DTR depends on having overlay networking working in UCP. +One way to test if overlay networks are working correctly you can deploy +containers in different nodes, that are attached to the same overlay network +and see if they can ping one another. + +Use SSH to log into a UCP node, and run: + +```none +docker run -it --rm \ + --net dtr-ol --name overlay-test1 \ + --entrypoint sh {{ page.dtr_org }}/{{ page.dtr_repo }} +``` + +Then use SSH to log into another UCP node and run: + +```none +docker run -it --rm \ + --net dtr-ol --name overlay-test2 \ + --entrypoint ping {{ page.dtr_org }}/{{ page.dtr_repo }} -c 3 overlay-test1 +``` + +If the second command succeeds, it means that overlay networking is working +correctly. + +You can run this test with any overlay network, and any Docker image that has +`sh` and `ping`. + + +## Access RethinkDB directly + +DTR uses RethinkDB for persisting data and replicating it across replicas. +It might be helpful to connect directly to the RethinkDB instance running on a +DTR replica to check the DTR internal state. + +> **Warning**: Modifying RethinkDB directly is not supported and may cause +> problems. +{: .warning } + +Use SSH to log into a node that is running a DTR replica, and run the following +commands: + +```bash +{% raw %} +# REPLICA_ID will be the replica ID for the current node. +REPLICA_ID=$(docker ps -lf name='^/dtr-rethinkdb-.{12}$' --format '{{.Names}}' | cut -d- -f3) +# This command will start a RethinkDB client attached to the database +# on the current node. +docker run -it --rm \ + --net dtr-ol \ + -v dtr-ca-$REPLICA_ID:/ca dockerhubenterprise/rethinkcli:v2.2.0 \ + $REPLICA_ID +{% endraw %} +``` + +This container connects to the local DTR replica and launches a RethinkDB client +that can be used to inspect the contents of the DB. RethinkDB +stores data in different databases that contain multiple tables. The `rethinkcli` +tool launches an interactive prompt where you can run RethinkDB +queries such as: + +```none +# List all the DBs in RethinkDB +> r.dbList() +[ 'dtr2', + 'jobrunner', + 'notaryserver', + 'notarysigner', + 'rethinkdb' ] + +# List the tables in the dtr2 db +> r.db('dtr2').tableList() +[ 'client_tokens', + 'events', + 'manifests', + 'namespace_team_access', + 'properties', + 'repositories', + 'repository_team_access', + 'tags' ] + +# List the entries in the repositories table +> r.db('dtr2').table('repositories') +[ { id: '19f1240a-08d8-4979-a898-6b0b5b2338d8', + name: 'my-test-repo', + namespaceAccountID: '924bf131-6213-43fa-a5ed-d73c7ccf392e', + pk: 'cf5e8bf1197e281c747f27e203e42e22721d5c0870b06dfb1060ad0970e99ada', + visibility: 'public' }, +... + +# List problems detected within the rethinkdb cluster +> r.db("rethinkdb").table("current_issues") +... +``` + +Indvidual DBs and tables are a private implementation detail and may change in DTR +from version to version, but you can always use `dbList()` and `tableList()` to explore +the contents and data structure. + +[Learn more about RethinkDB queries](https://www.rethinkdb.com/docs/guide/javascript/). + +## Recover from an unhealthy replica + +When a DTR replica is unhealthy or down, the DTR web UI displays a warning: + +```none +Warning: The following replicas are unhealthy: 59e4e9b0a254; Reasons: Replica reported health too long ago: 2017-02-18T01:11:20Z; Replicas 000000000000, 563f02aba617 are still healthy. +``` + +To fix this, you should remove the unhealthy replica from the DTR cluster, +and join a new one. Start by running: + +```none +docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} remove \ + --ucp-insecure-tls +``` + +And then: + +```none +docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} join \ + --ucp-node \ + --ucp-insecure-tls +``` diff --git a/datacenter/dtr/2.4/guides/admin/upgrade.md b/datacenter/dtr/2.4/guides/admin/upgrade.md new file mode 100644 index 0000000000..ac945bcc2f --- /dev/null +++ b/datacenter/dtr/2.4/guides/admin/upgrade.md @@ -0,0 +1,87 @@ +--- +title: Upgrade DTR +description: Learn how to upgrade your Docker Trusted Registry +keywords: dtr, upgrade, install +--- + +DTR uses [semantic versioning](http://semver.org/) and we aim to achieve specific +guarantees while upgrading between versions. We never support downgrading. We +support upgrades according to the following rules: + +* When upgrading from one patch version to another you can skip patch versions + because no data migration is done for patch versions. +* When upgrading between minor versions, you can't skip versions, but you can + upgrade from any patch versions of the previous minor version to any patch + version of the current minor version. +* When upgrading between major versions you also have to upgrade one major + version at a time, but you have to upgrade to the earliest available minor + version. We also strongly recommend upgrading to the latest minor/patch + version for your major version first. + +| Description | From | To | Supported | +|:-------------------------------------|:------|:----------|:----------| +| patch upgrade | x.y.0 | x.y.1 | yes | +| skip patch version | x.y.0 | x.y.2 | yes | +| patch downgrade | x.y.2 | x.y.1 | no | +| minor upgrade | x.y.* | x.y+1.* | yes | +| skip minor version | x.y.* | x.y+2.* | no | +| minor downgrade | x.y.* | x.y-1.* | no | +| skip major version | x.*.* | x+2.*.* | no | +| major downgrade | x.*.* | x-1.*.* | no | +| major upgrade | x.y.z | x+1.0.0 | yes | +| major upgrade skipping minor version | x.y.z | x+1.y+1.z | no | + +There may be at most a few seconds of interruption during the upgrade of a +DTR cluster. Schedule the upgrade to take place outside business peak hours +to ensure the impact on your business is close to none. + +## Minor upgrade + +Before starting your upgrade, make sure that: +* The version of UCP you are using is supported by the version of DTR you +are trying to upgrade to. +* You have a recent [DTR backup](backups-and-disaster-recovery.md). +* You [disable Docker content trust in UCP](/datacenter/ucp/2.2/guides/admin/configure/run-only-the-images-you-trust.md). + +### Step 1. Upgrade DTR to 2.2 if necessary + +Make sure you're running DTR 2.2. If that's not the case, [upgrade your installation to the 2.2 version](/datacenter/dtr/2.2/guides/admin/upgrade.md). + +### Step 2. Upgrade DTR + +Then pull the latest version of DTR: + +```none +$ docker pull {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} +``` + +If the node you're upgrading doesn't have access to the internet, you can +follow the [offline installation documentation](install/install-offline.md) +to get the images. + +Once you have the latest image on your machine (and the images on the target +nodes if upgrading offline), run the upgrade command: + +```none +$ docker run -it --rm \ + {{ page.dtr_org }}/{{ page.dtr_repo }}:{{ page.dtr_version }} upgrade \ + --ucp-insecure-tls +``` + +By default the upgrade command runs in interactive mode and prompts you for +any necessary information. You can also check the +[reference documentation](../../../reference/cli/index.md) for other existing flags. + +The upgrade command will start replacing every container in your DTR cluster, +one replica at a time. It will also perform certain data migrations. If anything +fails or the upgrade is interrupted for any reason, you can re-run the upgrade +command and it will resume from where it left off. + +## Patch upgrade + +A patch upgrade changes only the DTR containers and it's always safer than a minor +upgrade. The command is the same as for a minor upgrade. + +## Where to go next + +* [Release notes](../release-notes.md) diff --git a/datacenter/dtr/2.4/guides/architecture.md b/datacenter/dtr/2.4/guides/architecture.md new file mode 100644 index 0000000000..78081bc0ce --- /dev/null +++ b/datacenter/dtr/2.4/guides/architecture.md @@ -0,0 +1,102 @@ +--- +title: DTR architecture +description: Learn about the architecture of Docker Trusted Registry. +keywords: registry, dtr, architecture +--- + +Docker Trusted Registry (DTR) is a containerized application that runs on a +Docker Universal Control Plane cluster. + +![](images/architecture-1.svg) + +Once you have DTR deployed, you use your Docker CLI client to login, push, and +pull images. + +## Under the hood + +For high-availability you can deploy multiple DTR replicas, one on each UCP +worker node. + +![](images/architecture-2.svg) + +All DTR replicas run the same set of services and changes to their configuration +are automatically propagated to other replicas. + +## DTR internal components + +When you install DTR on a node, the following containers are started: + +| Name | Description | +|:-------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------| +| dtr-api-<replica_id> | Executes the DTR business logic. It serves the DTR web application, and API | +| dtr-garant-<replica_id> | Manages DTR authentication | +| dtr-jobrunner-<replica_id> | Runs cleanup jobs in the background | +| dtr-nginx-<replica_id> | Receives http and https requests and proxies them to other DTR components. By default it listens to ports 80 and 443 of the host | +| dtr-notary-server-<replica_id> | Receives, validates, and serves content trust metadata, and is consulted when pushing or pulling to DTR with content trust enabled | +| dtr-notary-signer-<replica_id> | Performs server-side timestamp and snapshot signing for content trust metadata | +| dtr-registry-<replica_id> | Implements the functionality for pulling and pushing Docker images. It also handles how images are stored | +| dtr-rethinkdb-<replica_id> | A database for persisting repository metadata | +| dtr-scanningstore-<replica_id> | Stores security scanning data | + +All these components are for internal use of DTR. Don't use them in your applications. + +## Networks used by DTR + +To allow containers to communicate, when installing DTR the following networks +are created: + +| Name | Type | Description | +|:-------|:--------|:---------------------------------------------------------------------------------------| +| dtr-ol | overlay | Allows DTR components running on different nodes to communicate, to replicate DTR data | + + +## Volumes used by DTR + +DTR uses these named volumes for persisting data: + +| Volume name | Description | +|:------------------------------------|:---------------------------------------------------------------------------------| +| dtr-ca-<replica_id> | Root key material for the DTR root CA that issues certificates | +| dtr-notary-<replica_id> | Certificate and keys for the Notary components | +| dtr-postgres-<replica_id> | Vulnerability scans data | +| dtr-registry-<replica_id> | Docker images data, if DTR is configured to store images on the local filesystem | +| dtr-rethink-<replica_id> | Repository metadata | +| dtr-nfs-registry-<replica_id> | Docker images data, if DTR is configured to store images on NFS | + +You can customize the volume driver used for these volumes, by creating the +volumes before installing DTR. During the installation, DTR checks which volumes +don't exist in the node, and creates them using the default volume driver. + +By default, the data for these volumes can be found at +`/var/lib/docker/volumes//_data`. + +## Image storage + +By default, Docker Trusted Registry stores images on the filesystem of the node +where it is running, but you should configure it to use a centralized storage +backend. + +![](images/architecture-3.svg) + +DTR supports these storage backends: + +* NFS +* Amazon S3 +* Cleversafe +* Google Cloud Storage +* OpenStack Swift +* Microsoft Azure + +## How to interact with DTR + +DTR has a web UI where you can manage settings and user permissions. + +![](images/architecture-4.svg) + +You can push and pull images using the standard Docker CLI client or other tools +that can interact with a Docker registry. + +## Where to go next + +* [System requirements](admin/install/system-requirements.md) +* [Install DTR](admin/install/index.md) diff --git a/datacenter/dtr/2.4/guides/images/Makefile b/datacenter/dtr/2.4/guides/images/Makefile new file mode 100644 index 0000000000..15b73ad543 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/Makefile @@ -0,0 +1,47 @@ + +SIZE="1280px" +HOST=dtr.domain.com +HOSTIP:=192.168.18.131 +HOSTURL=https://$(HOST) +IMAGE=svendowideit/screenshot +#IMAGE=screenshot +RUNOPTS=docker run --rm -v $(CURDIR):/srv --add-host $(HOST):$(HOSTIP) +RUN=$(RUNOPTS) $(IMAGE) + +all: + # Needs to be run with no authentication + $(RUN) $(HOSTURL)/admin/ admin-metrics.png $(SIZE) + $(RUN) $(HOSTURL)/admin/logs/ admin-logs.png $(SIZE) + $(RUN) $(HOSTURL)/admin/settings/auth/ admin-settings-authentication.png $(SIZE) + $(RUN) $(HOSTURL)/admin/settings/general admin-settings.png $(SIZE) + $(RUN) $(HOSTURL)/admin/settings/security admin-settings-security.png $(SIZE) + $(RUN) $(HOSTURL)/admin/settings/storage admin-settings-storage.png $(SIZE) + $(RUN) $(HOSTURL)/admin/settings/license admin-settings-license.png $(SIZE) + +manual: + # --env-file=passwords.env + $(RUNOPTS) --env-file=passwords.env \ + $(IMAGE) \ + $(HOSTURL)/admin/settings#auth admin-settings-authentication-basic.png $(SIZE) + + #admin-settings-authentication-ldap.png + + +# TODO: needs manual intervention atm +qs1: + # this requires the hostname to resolve. + echo "$HOST $HOSTIP" >> /etc/hosts + # and requires that host to be added to the docker daemon's insecure registry settings + # maybe use a dind daemon? + + docker pull jenkins + docker tag -f jenkins t400s.home.org.au/ci-infrastructure/jnkns-img + docker push t400s.home.org.au/ci-infrastructure/jnkns-img + sleep 1 + $(RUN) $(HOSTURL)/admin/ console-push.png $(SIZE) + sleep 10 +qs2: + docker rmi jenkins t400s.home.org.au/ci-infrastructure/jnkns-img + docker pull t400s.home.org.au/ci-infrastructure/jnkns-img + sleep 1 + $(RUN) $(HOSTURL)/admin/ console-pull.png $(SIZE) diff --git a/datacenter/dtr/2.4/guides/images/admin-logs.png b/datacenter/dtr/2.4/guides/images/admin-logs.png new file mode 100644 index 0000000000..de2920f3ba Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-logs.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-metrics.png b/datacenter/dtr/2.4/guides/images/admin-metrics.png new file mode 100644 index 0000000000..99a5d548ac Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-metrics.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-auth.png b/datacenter/dtr/2.4/guides/images/admin-settings-auth.png new file mode 100644 index 0000000000..d7dd0bef85 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-auth.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-authentication-basic.png b/datacenter/dtr/2.4/guides/images/admin-settings-authentication-basic.png new file mode 100644 index 0000000000..3d9cbbe463 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-authentication-basic.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-authentication-ldap.png b/datacenter/dtr/2.4/guides/images/admin-settings-authentication-ldap.png new file mode 100644 index 0000000000..22b2b13598 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-authentication-ldap.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-authentication.png b/datacenter/dtr/2.4/guides/images/admin-settings-authentication.png new file mode 100644 index 0000000000..6453784c17 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-authentication.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-license.png b/datacenter/dtr/2.4/guides/images/admin-settings-license.png new file mode 100644 index 0000000000..5ed5559032 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-license.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-license2.png b/datacenter/dtr/2.4/guides/images/admin-settings-license2.png new file mode 100644 index 0000000000..725ddd9281 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-license2.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-security.png b/datacenter/dtr/2.4/guides/images/admin-settings-security.png new file mode 100644 index 0000000000..67077fdf2d Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-security.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-storage-azure.png b/datacenter/dtr/2.4/guides/images/admin-settings-storage-azure.png new file mode 100644 index 0000000000..95c04cc303 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-storage-azure.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-storage-s3.png b/datacenter/dtr/2.4/guides/images/admin-settings-storage-s3.png new file mode 100644 index 0000000000..9e142fb309 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-storage-s3.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings-storage.png b/datacenter/dtr/2.4/guides/images/admin-settings-storage.png new file mode 100644 index 0000000000..f6256d4f77 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings-storage.png differ diff --git a/datacenter/dtr/2.4/guides/images/admin-settings.png b/datacenter/dtr/2.4/guides/images/admin-settings.png new file mode 100644 index 0000000000..665255fb13 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/admin-settings.png differ diff --git a/datacenter/dtr/2.4/guides/images/architecture-1.svg b/datacenter/dtr/2.4/guides/images/architecture-1.svg new file mode 100644 index 0000000000..2543230711 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/architecture-1.svg @@ -0,0 +1,75 @@ + + + + architecture-1 + Created with Sketch. + + + + + + + + + + cloud servers + + + + + + virtual servers + + + + + + physical servers + + + + + + + Docker Engine EE + + + + + + Universal Control Plane + + + + + + Docker Trusted Registry + + + + + + your applications + + + + + + + + + docker run + + + + + + + docker push + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/architecture-2.svg b/datacenter/dtr/2.4/guides/images/architecture-2.svg new file mode 100644 index 0000000000..c75df0b051 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/architecture-2.svg @@ -0,0 +1,225 @@ + + + + architecture-2 + Created with Sketch. + + + + + UCP cluster + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/architecture-3.svg b/datacenter/dtr/2.4/guides/images/architecture-3.svg new file mode 100644 index 0000000000..9741c337a5 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/architecture-3.svg @@ -0,0 +1,148 @@ + + + + architecture-3 + Created with Sketch. + + + + + + + + + + + DTR cluster + + + + + overlay network + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + + object + storage + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/architecture-4.svg b/datacenter/dtr/2.4/guides/images/architecture-4.svg new file mode 100644 index 0000000000..4f28043a93 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/architecture-4.svg @@ -0,0 +1,332 @@ + + + + architecture-4 + Created with Sketch. + + + + + + + + + + + + + + Docker swarm + + + + + + + + + your load balancer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + your load balancer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + + + + UI + + + + + + CLI + + + + + + + + UI + + + + + + CLI + + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/authentication-authorization-1.svg b/datacenter/dtr/2.4/guides/images/authentication-authorization-1.svg new file mode 100644 index 0000000000..72b3492d96 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/authentication-authorization-1.svg @@ -0,0 +1,90 @@ + + + + dtr-authorization-1 + Created with Sketch. + + + + + + + + + + + + + + + billing team + + + + + blog team + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + whale/node + + + + + + whale/java + + + + + + whale/golang + + + + + + + Whale organization + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/aws-dtr-sg-rules.png b/datacenter/dtr/2.4/guides/images/aws-dtr-sg-rules.png new file mode 100644 index 0000000000..c8cf00297b Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/aws-dtr-sg-rules.png differ diff --git a/datacenter/dtr/2.4/guides/images/aws-engine-sg-rules.png b/datacenter/dtr/2.4/guides/images/aws-engine-sg-rules.png new file mode 100644 index 0000000000..0d6d6e821b Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/aws-engine-sg-rules.png differ diff --git a/datacenter/dtr/2.4/guides/images/aws-instance-id.png b/datacenter/dtr/2.4/guides/images/aws-instance-id.png new file mode 100644 index 0000000000..6337bf442a Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/aws-instance-id.png differ diff --git a/datacenter/dtr/2.4/guides/images/azure_filter.png b/datacenter/dtr/2.4/guides/images/azure_filter.png new file mode 100644 index 0000000000..bc89660185 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/azure_filter.png differ diff --git a/datacenter/dtr/2.4/guides/images/azure_ip.png b/datacenter/dtr/2.4/guides/images/azure_ip.png new file mode 100644 index 0000000000..d42e97bddd Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/azure_ip.png differ diff --git a/datacenter/dtr/2.4/guides/images/azure_portal.png b/datacenter/dtr/2.4/guides/images/azure_portal.png new file mode 100644 index 0000000000..b0507cbed6 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/azure_portal.png differ diff --git a/datacenter/dtr/2.4/guides/images/basic_configuration.png b/datacenter/dtr/2.4/guides/images/basic_configuration.png new file mode 100644 index 0000000000..c7845b0198 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/basic_configuration.png differ diff --git a/datacenter/dtr/2.4/guides/images/cache-docker-images-1.svg b/datacenter/dtr/2.4/guides/images/cache-docker-images-1.svg new file mode 100644 index 0000000000..a802e224ba --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/cache-docker-images-1.svg @@ -0,0 +1,44 @@ + + + + content-cache-1 + Created with Sketch. + + + + + + + + + + + + + + cache AS + + + + + + cache EU + + + + + + cache US + + + + + + + DTR + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/cache-docker-images-2.png b/datacenter/dtr/2.4/guides/images/cache-docker-images-2.png new file mode 100644 index 0000000000..15e6130890 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/cache-docker-images-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/cache-docker-images-2.svg b/datacenter/dtr/2.4/guides/images/cache-docker-images-2.svg new file mode 100644 index 0000000000..bac8275eea --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/cache-docker-images-2.svg @@ -0,0 +1,166 @@ + + + + content-cache-2 + Created with Sketch. + + + + + UCP cluster + + + + + + + + + worker node + + + + + + + Docker + + + + + + UCP agent + + + + + + DTR cache + + + + + + + + + + worker node + + + + + + + Docker + + + + + + UCP agent + + + + + + DTR cache + + + + + + + + + + + + worker node + + + + + + + Docker + + + + + + UCP agent + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker + + + + + + UCP agent + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker + + + + + + UCP agent + + + + + + DTR + + + + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/cache-docker-images-3.png b/datacenter/dtr/2.4/guides/images/cache-docker-images-3.png new file mode 100644 index 0000000000..7e236ee0f1 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/cache-docker-images-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/cache-docker-images-4.png b/datacenter/dtr/2.4/guides/images/cache-docker-images-4.png new file mode 100644 index 0000000000..059734ecba Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/cache-docker-images-4.png differ diff --git a/datacenter/dtr/2.4/guides/images/chaining-1.svg b/datacenter/dtr/2.4/guides/images/chaining-1.svg new file mode 100644 index 0000000000..efd630c423 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/chaining-1.svg @@ -0,0 +1,53 @@ + + + + chaining-1 + Created with Sketch. + + + + + + + + + + + + + + + cache CH + + + + + + + + cache AS + + + + + + cache EU + + + + + + cache US + + + + + + + DTR + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/configure-external-storage-1.svg b/datacenter/dtr/2.4/guides/images/configure-external-storage-1.svg new file mode 100644 index 0000000000..9741c337a5 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/configure-external-storage-1.svg @@ -0,0 +1,148 @@ + + + + architecture-3 + Created with Sketch. + + + + + + + + + + + DTR cluster + + + + + overlay network + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + + object + storage + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/configure-external-storage-2.png b/datacenter/dtr/2.4/guides/images/configure-external-storage-2.png new file mode 100644 index 0000000000..aa4fe15908 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/configure-external-storage-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/console-pull.png b/datacenter/dtr/2.4/guides/images/console-pull.png new file mode 100644 index 0000000000..c2d1194bed Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/console-pull.png differ diff --git a/datacenter/dtr/2.4/guides/images/console-push.png b/datacenter/dtr/2.4/guides/images/console-push.png new file mode 100644 index 0000000000..79ddc7d5ef Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/console-push.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-1.png b/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-1.png new file mode 100644 index 0000000000..6cf9cabdf3 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-2.png b/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-2.png new file mode 100644 index 0000000000..e7595d35a7 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-3.png b/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-3.png new file mode 100644 index 0000000000..92e5de41f3 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-and-manage-orgs-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-and-manage-teams-1.png b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-1.png new file mode 100644 index 0000000000..4a79b53948 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-and-manage-teams-2.png b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-2.png new file mode 100644 index 0000000000..5659e1c078 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-and-manage-teams-3.png b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-3.png new file mode 100644 index 0000000000..da89e922e5 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-and-manage-teams-4.png b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-4.png new file mode 100644 index 0000000000..07f464c17b Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-4.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-and-manage-teams-5.png b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-5.png new file mode 100644 index 0000000000..cc8a63c170 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-and-manage-teams-5.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-deployment-policies-1.svg b/datacenter/dtr/2.4/guides/images/create-deployment-policies-1.svg new file mode 100644 index 0000000000..d71bb7a6aa --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/create-deployment-policies-1.svg @@ -0,0 +1,99 @@ + + + + image-promotion + Created with Sketch. + + + + + + + DTR cluster + + + + + 2017-05-16 + + + + docker/website-prod + + + + + + + + 1 + 2 + 3-stable + + + + docker/website-dev + + + + + + + + + your machine or a CI system + + + + > docker push + + + + 3-stable + + + + docker/website-dev + + + + + + + > docker build + + + + + + + + + 3 + + + + + + + + + + 2 + + + + + + + + + + 1 + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/create-deployment-policies-2.png b/datacenter/dtr/2.4/guides/images/create-deployment-policies-2.png new file mode 100644 index 0000000000..ae44bbfa93 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-deployment-policies-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-deployment-policies-3.png b/datacenter/dtr/2.4/guides/images/create-deployment-policies-3.png new file mode 100644 index 0000000000..c92f216984 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-deployment-policies-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-deployment-policies-4.png b/datacenter/dtr/2.4/guides/images/create-deployment-policies-4.png new file mode 100644 index 0000000000..974edcef53 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-deployment-policies-4.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-manage-users-1.png b/datacenter/dtr/2.4/guides/images/create-manage-users-1.png new file mode 100644 index 0000000000..177878b701 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-manage-users-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-manage-users-2.png b/datacenter/dtr/2.4/guides/images/create-manage-users-2.png new file mode 100644 index 0000000000..838432cf45 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-manage-users-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-repository-1.png b/datacenter/dtr/2.4/guides/images/create-repository-1.png new file mode 100644 index 0000000000..44975b7656 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-repository-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/create-repository-2.png b/datacenter/dtr/2.4/guides/images/create-repository-2.png new file mode 100644 index 0000000000..692d0c2e27 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/create-repository-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/dashboard-settings-general.png b/datacenter/dtr/2.4/guides/images/dashboard-settings-general.png new file mode 100644 index 0000000000..f30a948b0c Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/dashboard-settings-general.png differ diff --git a/datacenter/dtr/2.4/guides/images/delegate-image-signing-1.svg b/datacenter/dtr/2.4/guides/images/delegate-image-signing-1.svg new file mode 100644 index 0000000000..e3e5239efe --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/delegate-image-signing-1.svg @@ -0,0 +1,81 @@ + + + + delegate-image-signing-1 + Created with Sketch. + + + + + + + + + + IT ops team + + + + + QA team + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dev/node + + + + + + dev/java + + + + + + dev/nginx + + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/delete-images-1.png b/datacenter/dtr/2.4/guides/images/delete-images-1.png new file mode 100644 index 0000000000..97203ec17e Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/delete-images-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/docker-hub-org-enterprise-license-CSDE-dropdown.png b/datacenter/dtr/2.4/guides/images/docker-hub-org-enterprise-license-CSDE-dropdown.png new file mode 100644 index 0000000000..fe7a6d2045 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/docker-hub-org-enterprise-license-CSDE-dropdown.png differ diff --git a/datacenter/dtr/2.4/guides/images/docker-hub-org-enterprise-license.png b/datacenter/dtr/2.4/guides/images/docker-hub-org-enterprise-license.png new file mode 100644 index 0000000000..2f2976f1a3 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/docker-hub-org-enterprise-license.png differ diff --git a/datacenter/dtr/2.4/guides/images/dtr-integration-1.png b/datacenter/dtr/2.4/guides/images/dtr-integration-1.png new file mode 100644 index 0000000000..a73ef063c1 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/dtr-integration-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/dtr-license-download.png b/datacenter/dtr/2.4/guides/images/dtr-license-download.png new file mode 100644 index 0000000000..f614e202a8 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/dtr-license-download.png differ diff --git a/datacenter/dtr/2.4/guides/images/enable-sso-1.png b/datacenter/dtr/2.4/guides/images/enable-sso-1.png new file mode 100644 index 0000000000..576360bc59 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/enable-sso-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/garbage-collection-1.png b/datacenter/dtr/2.4/guides/images/garbage-collection-1.png new file mode 100644 index 0000000000..bdc2891f9e Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/garbage-collection-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/garbage-collection-2.png b/datacenter/dtr/2.4/guides/images/garbage-collection-2.png new file mode 100644 index 0000000000..6f17832893 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/garbage-collection-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/garbage-collection-3.png b/datacenter/dtr/2.4/guides/images/garbage-collection-3.png new file mode 100644 index 0000000000..58c56cf63e Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/garbage-collection-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/immutable-repo-1.png b/datacenter/dtr/2.4/guides/images/immutable-repo-1.png new file mode 100644 index 0000000000..2a72636da7 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/immutable-repo-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/install-dtr-1.svg b/datacenter/dtr/2.4/guides/images/install-dtr-1.svg new file mode 100644 index 0000000000..c75df0b051 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/install-dtr-1.svg @@ -0,0 +1,225 @@ + + + + architecture-2 + Created with Sketch. + + + + + UCP cluster + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/install-dtr-2.png b/datacenter/dtr/2.4/guides/images/install-dtr-2.png new file mode 100644 index 0000000000..33471adfcd Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/install-dtr-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/install-dtr-3.png b/datacenter/dtr/2.4/guides/images/install-dtr-3.png new file mode 100644 index 0000000000..e7ccce57d9 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/install-dtr-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/install-dtr-4.png b/datacenter/dtr/2.4/guides/images/install-dtr-4.png new file mode 100644 index 0000000000..8b04d1b80c Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/install-dtr-4.png differ diff --git a/datacenter/dtr/2.4/guides/images/install-dtr-5.png b/datacenter/dtr/2.4/guides/images/install-dtr-5.png new file mode 100644 index 0000000000..9c8fbce716 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/install-dtr-5.png differ diff --git a/datacenter/dtr/2.4/guides/images/install-dtr-6.png b/datacenter/dtr/2.4/guides/images/install-dtr-6.png new file mode 100644 index 0000000000..d87014cfee Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/install-dtr-6.png differ diff --git a/datacenter/dtr/2.4/guides/images/jenkins-plugins.png b/datacenter/dtr/2.4/guides/images/jenkins-plugins.png new file mode 100644 index 0000000000..82cd8a00f9 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/jenkins-plugins.png differ diff --git a/datacenter/dtr/2.4/guides/images/jenkins-ui.png b/datacenter/dtr/2.4/guides/images/jenkins-ui.png new file mode 100644 index 0000000000..e828dfbab8 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/jenkins-ui.png differ diff --git a/datacenter/dtr/2.4/guides/images/license-1.png b/datacenter/dtr/2.4/guides/images/license-1.png new file mode 100644 index 0000000000..3b0b0c07bb Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/license-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/license-2.png b/datacenter/dtr/2.4/guides/images/license-2.png new file mode 100644 index 0000000000..bbff97fe76 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/license-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/manage-webhooks-1.png b/datacenter/dtr/2.4/guides/images/manage-webhooks-1.png new file mode 100644 index 0000000000..632a5315b7 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/manage-webhooks-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/manage-webhooks-2.png b/datacenter/dtr/2.4/guides/images/manage-webhooks-2.png new file mode 100644 index 0000000000..15d2157e21 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/manage-webhooks-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/monitor-1.png b/datacenter/dtr/2.4/guides/images/monitor-1.png new file mode 100644 index 0000000000..06e94f61b0 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/monitor-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/monitor-2.png b/datacenter/dtr/2.4/guides/images/monitor-2.png new file mode 100644 index 0000000000..7e52625a26 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/monitor-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/monitor-3.png b/datacenter/dtr/2.4/guides/images/monitor-3.png new file mode 100644 index 0000000000..feb7b4e016 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/monitor-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/overview-1.png b/datacenter/dtr/2.4/guides/images/overview-1.png new file mode 100644 index 0000000000..36153b8a07 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/overview-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/overview-2.png b/datacenter/dtr/2.4/guides/images/overview-2.png new file mode 100644 index 0000000000..9bb034c54d Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/overview-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/pull-push-images-1.png b/datacenter/dtr/2.4/guides/images/pull-push-images-1.png new file mode 100644 index 0000000000..9a031b29a4 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/pull-push-images-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/pull-push-images-2.png b/datacenter/dtr/2.4/guides/images/pull-push-images-2.png new file mode 100644 index 0000000000..2caf2ca2ca Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/pull-push-images-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/pull-push-images-3.png b/datacenter/dtr/2.4/guides/images/pull-push-images-3.png new file mode 100644 index 0000000000..11c65d496e Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/pull-push-images-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/release-notes-1.png b/datacenter/dtr/2.4/guides/images/release-notes-1.png new file mode 100644 index 0000000000..a02df72972 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/release-notes-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/repo.png b/datacenter/dtr/2.4/guides/images/repo.png new file mode 100644 index 0000000000..9b08a6bbfc Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/repo.png differ diff --git a/datacenter/dtr/2.4/guides/images/s3-1.png b/datacenter/dtr/2.4/guides/images/s3-1.png new file mode 100644 index 0000000000..df1ca52183 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/s3-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-1.png b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-1.png new file mode 100644 index 0000000000..b515d4c452 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-2.png b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-2.png new file mode 100644 index 0000000000..9748dbfa81 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-3.png b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-3.png new file mode 100644 index 0000000000..6d2d4f1e11 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-4.png b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-4.png new file mode 100644 index 0000000000..fe0a5d513c Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-4.png differ diff --git a/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-5.png b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-5.png new file mode 100644 index 0000000000..294889667e Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/scan-images-for-vulns-5.png differ diff --git a/datacenter/dtr/2.4/guides/images/scanning_video.png b/datacenter/dtr/2.4/guides/images/scanning_video.png new file mode 100644 index 0000000000..efa6737639 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/scanning_video.png differ diff --git a/datacenter/dtr/2.4/guides/images/script-copy.png b/datacenter/dtr/2.4/guides/images/script-copy.png new file mode 100644 index 0000000000..3fdf87c7b8 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/script-copy.png differ diff --git a/datacenter/dtr/2.4/guides/images/security-scanning-setup-1.png b/datacenter/dtr/2.4/guides/images/security-scanning-setup-1.png new file mode 100644 index 0000000000..7db7a312c5 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/security-scanning-setup-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/security-scanning-setup-2.png b/datacenter/dtr/2.4/guides/images/security-scanning-setup-2.png new file mode 100644 index 0000000000..bbff97fe76 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/security-scanning-setup-2.png differ diff --git a/datacenter/dtr/2.4/guides/images/security-scanning-setup-3.png b/datacenter/dtr/2.4/guides/images/security-scanning-setup-3.png new file mode 100644 index 0000000000..d90a56a2f0 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/security-scanning-setup-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/security-scanning-setup-4.png b/datacenter/dtr/2.4/guides/images/security-scanning-setup-4.png new file mode 100644 index 0000000000..9a1eaae531 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/security-scanning-setup-4.png differ diff --git a/datacenter/dtr/2.4/guides/images/security-scanning-setup-5.png b/datacenter/dtr/2.4/guides/images/security-scanning-setup-5.png new file mode 100644 index 0000000000..4e93286bf0 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/security-scanning-setup-5.png differ diff --git a/datacenter/dtr/2.4/guides/images/security-scanning-setup-6.png b/datacenter/dtr/2.4/guides/images/security-scanning-setup-6.png new file mode 100644 index 0000000000..6fc1a38b4e Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/security-scanning-setup-6.png differ diff --git a/datacenter/dtr/2.4/guides/images/security-scanning-setup-7.png b/datacenter/dtr/2.4/guides/images/security-scanning-setup-7.png new file mode 100644 index 0000000000..2acf1ae462 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/security-scanning-setup-7.png differ diff --git a/datacenter/dtr/2.4/guides/images/set-up-high-availability-1.svg b/datacenter/dtr/2.4/guides/images/set-up-high-availability-1.svg new file mode 100644 index 0000000000..4f28043a93 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/set-up-high-availability-1.svg @@ -0,0 +1,332 @@ + + + + architecture-4 + Created with Sketch. + + + + + + + + + + + + + + Docker swarm + + + + + + + + + your load balancer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + your load balancer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + + + + UI + + + + + + CLI + + + + + + + + UI + + + + + + CLI + + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/sign-an-image-1.svg b/datacenter/dtr/2.4/guides/images/sign-an-image-1.svg new file mode 100644 index 0000000000..f172feea36 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/sign-an-image-1.svg @@ -0,0 +1,156 @@ + + + + sign-an-image-1 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DTR + + + + + + + + notary server + + + + + + registry + + + + + + + + + + + + + + + + + + + + + + + + + + + dev/nginx:1 + + + + + + + + + + + + front-end + + + + + + + > docker push + + + + + + + + + + + + + + + + + dave.lauper + + + 9baa16 + + + 1 + + + + + last pushed + + + id + + + tag + + + + + + + dev/nginx + + + + + + + docker trusted registry + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/sign-an-image-2.svg b/datacenter/dtr/2.4/guides/images/sign-an-image-2.svg new file mode 100644 index 0000000000..c3028766b9 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/sign-an-image-2.svg @@ -0,0 +1,166 @@ + + + + sign-an-image-2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DTR + + + + + + + + notary server + + + + + + registry + + + + + + + + + + + + + + + dev/nginx:1 + digest: m647f0 + signed-by: 53f4a3 + + + + + + + + + + + + + + + dev/nginx:1 + + + + + + + + + + + + front-end + + + + + + + > export DOCKER_CONTENT_TRUST=1 + docker push + + + + + + + + + + + + + + + + + dave.lauper + + + 9baa16 + + + 1 + + + + + + + + + last pushed + + + id + + + tag + + + + + + + dev/nginx + + + + + + + docker trusted registry + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/sign-an-image-3.png b/datacenter/dtr/2.4/guides/images/sign-an-image-3.png new file mode 100644 index 0000000000..c8253b31a6 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/sign-an-image-3.png differ diff --git a/datacenter/dtr/2.4/guides/images/troubleshoot-batch-jobs-1.svg b/datacenter/dtr/2.4/guides/images/troubleshoot-batch-jobs-1.svg new file mode 100644 index 0000000000..322e1c501d --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/troubleshoot-batch-jobs-1.svg @@ -0,0 +1,170 @@ + + + + troubleshoot-batch-jobs + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DTR cluster + + + + + job queue + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + worker node + + + + + + + DTR + + + + + + + + + Job runner + + + + + + + + + + worker node + + + + + + + DTR + + + + + + + + + Job runner + + + + + + + + + + worker node + + + + + + + DTR + + + + + + + + + Job runner + + + + + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/use-a-cache-1.png b/datacenter/dtr/2.4/guides/images/use-a-cache-1.png new file mode 100644 index 0000000000..1404c482cb Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/use-a-cache-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/use-a-load-balancer-1.svg b/datacenter/dtr/2.4/guides/images/use-a-load-balancer-1.svg new file mode 100644 index 0000000000..4f28043a93 --- /dev/null +++ b/datacenter/dtr/2.4/guides/images/use-a-load-balancer-1.svg @@ -0,0 +1,332 @@ + + + + architecture-4 + Created with Sketch. + + + + + + + + + + + + + + Docker swarm + + + + + + + + + your load balancer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + your load balancer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + worker node + + + + + + + Docker Engine EE + + + + + + UCP worker + + + + + + DTR + + + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + manager node + + + + + + + Docker Engine EE + + + + + + UCP manager + + + + + + + + + + + + + UI + + + + + + CLI + + + + + + + + UI + + + + + + CLI + + + + + + + + \ No newline at end of file diff --git a/datacenter/dtr/2.4/guides/images/use-a-web-proxy-1.png b/datacenter/dtr/2.4/guides/images/use-a-web-proxy-1.png new file mode 100644 index 0000000000..008e1fb55c Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/use-a-web-proxy-1.png differ diff --git a/datacenter/dtr/2.4/guides/images/use-your-certificates-1.png b/datacenter/dtr/2.4/guides/images/use-your-certificates-1.png new file mode 100644 index 0000000000..bf841a31f5 Binary files /dev/null and b/datacenter/dtr/2.4/guides/images/use-your-certificates-1.png differ diff --git a/datacenter/dtr/2.4/guides/index.md b/datacenter/dtr/2.4/guides/index.md new file mode 100644 index 0000000000..72cafa9fce --- /dev/null +++ b/datacenter/dtr/2.4/guides/index.md @@ -0,0 +1,71 @@ +--- +title: Docker Trusted Registry overview +description: Learn how to install, configure, and use Docker Trusted Registry. +keywords: registry, repository, images +redirect_from: +- /docker-hub-enterprise/ +- /docker-trusted-registry/overview/ +- /docker-trusted-registry/ +--- + +Docker Trusted Registry (DTR) is the enterprise-grade image storage solution +from Docker. You install it behind your firewall so that you can securely store +and manage the Docker images you use in your applications. + +## Image management + +DTR can be installed on-premises, or on a virtual private +cloud. And with it, you can store your Docker images securely, behind your +firewall. + +You can use DTR as part of your continuous integration, and continuous +delivery processes to build, ship, and run your applications. + +DTR has a web based user interface that allows authorized users in your +organization to browse docker images. It provides information about +who pushed what image at what time. It even allows you to see what dockerfile +lines were used to produce the image and, if security scanning is enabled, to +see a list of all of the software installed in your images. + +## Availability + +DTR is highly available through the use of multiple replicas of all containers +and metadata such that if a machine fails, DTR continues to operate and can be repaired. + +## Efficiency + +DTR has the ability to [cache images closer to users](../admin/configure/deploy-caches/index.md) +to reduce the amount of bandwidth used during docker pulls. + +DTR has the ability to [clean up unreferenced manifests and layers](../configure/garbage-collection.md). + +## Built-in access control + +DTR uses the same authentication mechanism as Docker Universal Control Plane. +Users can be managed manually or synched from LDAP or Active Directory. DTR +uses [Role Based Access Control](admin/manage-users/index.md) (RBAC) to allow you to implement fine-grained +access control policies for who has access to your Docker images. + +## Security scanning + +DTR has a built in security scanner that can be used to discover what versions +of software are used in your images. It scans each layer and aggregates the +results to give you a complete picture of what you are shipping as a part of +your stack. Most importantly, it co-relates this information with a +vulnerability database that is kept up to date through [periodic +updates](admin/configure/set-up-vulnerability-scans.md). This +gives you [unprecedented insight into your exposure to known security +threats](user/manage-images/scan-images-for-vulnerabilities.md). + +## Image signing + +DTR ships with [Notary](/notary/getting_started.md) +built in so that you can use +[Docker Content Trust](/engine/security/trust/content_trust.md) to sign +and verify images. For more information about managing Notary data in DTR see +the [DTR-specific notary documentation](user/manage-images/manage-trusted-repositories.md). + +## Where to go next + +* [DTR architecture](architecture.md) +* [Install DTR](admin/install/index.md) diff --git a/datacenter/dtr/2.4/guides/release-notes.md b/datacenter/dtr/2.4/guides/release-notes.md new file mode 100644 index 0000000000..82104a63e4 --- /dev/null +++ b/datacenter/dtr/2.4/guides/release-notes.md @@ -0,0 +1,14 @@ +--- +title: DTR 2.4 release notes +description: Learn about the new features, bug fixes, and breaking changes for Docker Trusted Registry +keywords: docker trusted registry, whats new, release notes +toc_max: 2 +--- + +Here you can learn about new features, bug fixes, breaking changes, and +known issues for each DTR version. + +You can then use [the upgrade instructions](admin/upgrade.md), +to upgrade your installation to the latest release. + +## DTR 2.4.0 diff --git a/datacenter/dtr/2.4/guides/support.md b/datacenter/dtr/2.4/guides/support.md new file mode 100644 index 0000000000..8f520e77fd --- /dev/null +++ b/datacenter/dtr/2.4/guides/support.md @@ -0,0 +1,16 @@ +--- +title: Get support for DTR +description: Your Docker subscription gives you access to prioritized support. You + can file tickets via email, your the support portal. +keywords: support, help +--- + +Your Docker Data Center, or Docker Trusted Registry subscription gives you +access to prioritized support. The service levels depend on your subscription. + +If you need help, you can file a ticket via: + +* [Email](mailto:support@docker.com) +* [Docker support page](https://support.docker.com/) + +Be sure to use your company email when filing tickets. diff --git a/datacenter/dtr/2.4/guides/user/access-dtr/configure-your-notary-client.md b/datacenter/dtr/2.4/guides/user/access-dtr/configure-your-notary-client.md new file mode 100644 index 0000000000..d352c82c00 --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/access-dtr/configure-your-notary-client.md @@ -0,0 +1,133 @@ +--- +title: Configure your Notary client +description: Learn how to configure your Notary client to push and pull images from Docker Trusted Registry. +keywords: registry, notary, trust +--- + +The Docker CLI client makes it easy to sign images but to streamline that +process it generates a set of private and public keys that are not tied +to your UCP account. This means that you'll be able to push and sign images to +DTR, but UCP won't trust those images since it doesn't know anything about +the keys you're using. + +So before signing and pushing images to DTR you should: + +* Configure the Notary CLI client +* Import your UCP private keys to the Notary client + +This allows you to start signing images with the private keys in your UCP +client bundle, that UCP can trace back to your user account. + +## Download the Notary CLI client + +If you're using Docker for Mac or Docker for Windows, you already have the +`notary` command installed. + +If you're running Docker on a Linux distribution, you can [download the +latest version](https://github.com/docker/notary/releases). As an example: + +```bash +# Get the latest binary +curl -L -o notary + +# Make it executable +chmod +x notary + +# Move it to a location in your path +sudo mv notary /usr/bin/ +``` + +## Configure the Notary CLI client + +Before you use the Notary CLI client, you need to configure it to make it +talk with the Notary server that's part of DTR. + +There's two ways to do this, either by passing flags to the notary command, +or using a configuration file. + +### With flags + +Run the Notary command with: + +```bash +notary --server https:// --trustDir ~/.docker/trust --tlscacert --help +``` + +Here's what the flags mean: + +| Flag | Purpose | +|:--------------|:----------------------------------------------------------------------------------------------------------------------------------| +| `--server` | The Notary server to query | +| `--trustDir` | Path to the local directory where trust metadata will be stored | +| `--tlscacert` | Path to the DTR CA certificate. If you've configured your system to trust the DTR CA certificate, you don't need to use this flag | + +To avoid having to type all the flags when using the command, you can set an +alias: + + + +
+
+``` +alias notary="notary --server https:// --trustDir ~/.docker/trust --tlscacert " +``` +
+
+
+``` +set-alias notary "notary --server https:// --trustDir ~/.docker/trust --tlscacert " +``` +
+
+
+ +### With a configuration file + +You can also configure Notary by creating a `~/.notary/config.json` file with +the following content: + +```json +{ + "trust_dir" : "~/.docker/trust", + "remote_server": { + "url": "", + "root_ca": "" + } +} +``` + +To validate your configuration, try running the `notary list` command on a +DTR repository that already has signed images: + +```bash +notary list // +``` + +The command should print a list of digests for each signed image on the +repository. + +## Import your UCP key + +The last step in configuring the Notary CLI client is to import the private +key of your UCP client bundle. +[Get a new client bundle if you don't have one yet](/datacenter/ucp/2.2/guides/user/access-ucp/cli-based-access.md). + +Import the private key in your UCP bundle into the Notary CLI client: + +```bash +notary key import +``` + +The private key is copied to `~/.docker/trust`, and you'll be prompted for a +password to encrypt it. + +You can validate what keys Notary knows about by running: + +```bash +notary key list +``` + +The key you've imported should be listed with the role `delegation`. diff --git a/datacenter/dtr/2.4/guides/user/access-dtr/index.md b/datacenter/dtr/2.4/guides/user/access-dtr/index.md new file mode 100644 index 0000000000..af8bee99f6 --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/access-dtr/index.md @@ -0,0 +1,121 @@ +--- +title: Configure your Docker Engine +description: Learn how to configure your Docker Engine to push and pull images from Docker Trusted Registry. +keywords: registry, TLS, certificates +--- + +By default Docker Engine uses TLS when pushing and pulling images to an +image registry like Docker Trusted Registry. + +If DTR is using the default configurations or was configured to use self-signed +certificates, you need to configure your Docker Engine to trust DTR. Otherwise, +when you try to log in, push to, or pull images from DTR, you'll get an error: + +```none +$ docker login dtr.example.org + +x509: certificate signed by unknown authority +``` + +The first step to make your Docker Engine trust the certificate authority used +by DTR is to get the DTR CA certificate. Then you configure your operating +system to trust that certificate. + +## Configure your host + +### macOS + +In your browser navigate to `https:///ca` to download the TLS +certificate used by DTR. Then +[add that certificate to macOS Keychain](https://support.apple.com/kb/PH20129). + +After adding the CA certificate to Keychain, restart Docker for Mac. + +### Windows + +In your browser navigate to `https:///ca` to download the TLS +certificate used by DTR. Open Windows Explorer, right-click the +file you've downloaded, and choose **Install certificate**. + +Then, select the following options: + +* Store location: local machine +* Check **place all certificates in the following store** +* Click **Browser**, and select **Trusted Root Certificate Authorities** +* Click **Finish** + +[Learn more about managing TLS certificates](https://technet.microsoft.com/en-us/library/cc754841(v=ws.11).aspx#BKMK_addlocal). + +After adding the CA certificate to Windows, restart Docker for Windows. + +### Ubuntu/ Debian + +```bash +# Download the DTR CA certificate +$ sudo curl -k https:///ca -o /usr/local/share/ca-certificates/.crt +# Refresh the list of certificates to trust +$ sudo update-ca-certificates +# Restart the Docker daemon +$ sudo service docker restart +``` + +### RHEL/ CentOS + +```bash +# Download the DTR CA certificate +$ sudo curl -k https:///ca -o /etc/pki/ca-trust/source/anchors/.crt +# Refresh the list of certificates to trust +$ sudo update-ca-trust +# Restart the Docker daemon +$ sudo /bin/systemctl restart docker.service +``` + +### Boot2Docker + +1. Log into the virtual machine with ssh: + + ```bash + docker-machine ssh + ``` + +2. Create the `bootsync.sh` file, and make it executable: + + ```bash + sudo touch /var/lib/boot2docker/bootsync.sh + sudo chmod 755 /var/lib/boot2docker/bootsync.sh + ``` + +3. Add the following content to the `bootsync.sh` file. You can use nano or vi + for this. + + ```bash + #!/bin/sh + + cat /var/lib/boot2docker/server.pem >> /etc/ssl/certs/ca-certificates.crt + ``` + +4. Add the DTR CA certificate to the `server.pem` file: + + ```bash + curl -k https:///ca | sudo tee -a /var/lib/boot2docker/server.pem + ``` + +5. Run `bootsync.sh` and restart the Docker daemon: + + ```bash + sudo /var/lib/boot2docker/bootsync.sh + sudo /etc/init.d/docker restart + ``` + +## Log into DTR + +To validate that your Docker daemon trusts DTR, try authenticating against +DTR. + +```bash +docker login dtr.example.org +``` + +## Where to go next + +* [Use a cache](use-a-cache.md) diff --git a/datacenter/dtr/2.4/guides/user/access-dtr/use-a-cache.md b/datacenter/dtr/2.4/guides/user/access-dtr/use-a-cache.md new file mode 100644 index 0000000000..9930961c18 --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/access-dtr/use-a-cache.md @@ -0,0 +1,17 @@ +--- +title: Use a cache +description: Learn how to configure your Docker Trusted Registry account to pull images from a cache for faster download times. +keywords: registry, cache +--- + +Docker Trusted Registry can be configured to have one or more caches. This +allows you to choose from which cache to pull images from for faster +download times. + +If an administrator has set up caches, you can choose which cache to use when +pulling images. In the **DTR web UI**, navigate to your **user profile**, +and check the **Content Cache** options. + +![](../../images/use-a-cache-1.png){: .with-border} + +Once you save, your images are pulled from the cache instead of the central DTR. diff --git a/datacenter/dtr/2.4/guides/user/create-and-manage-webhooks.md b/datacenter/dtr/2.4/guides/user/create-and-manage-webhooks.md new file mode 100644 index 0000000000..a706eceb5d --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/create-and-manage-webhooks.md @@ -0,0 +1,48 @@ +--- +title: Manage webhooks +description: Learn how to create, configure, and test webhooks in Docker Trusted Registry. +keywords: registry, webhooks +--- + +DTR has webhooks so that you can run custom logic when an event happens. This +lets you build complex CI and CD pipelines with your Docker images. + +## Create a webhook + +To create a webhook, navigate to the **repository details** page, choose +the **Webhooks** tab, and click **New Webhook**. + +![](../images/manage-webhooks-1.png){: .with-border} + +Select the event that will trigger the webhook, and set the URL to send +information about the event. Once everything is set up, click **Test** for +DTR to send a JSON payload to the URL you set up, so that you can validate +that the integration is working. You'll get an event that looks like this: + +``` +{ + "contents": { + "architecture": "amd64", + "author": "", + "digest": "sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c", + "imageName": "example.com/foo/bar:latest", + "namespace": "foo", + "os": "linux", + "pushedAt": "2015-01-02T15:04:05Z", + "repository": "bar", + "tag": "latest" + }, + "createdAt": "2017-06-20T01:29:53.046620425Z", + "location": "/repositories/foo/bar/tags/latest", + "type": "TAG_PUSH" +} +``` + +Once you save, your webhook is active and starts sending notifications when +the event is triggered. + +![](../images/manage-webhooks-2.png){: .with-border} + +## Where to go next + +* [Create deployment policies](create-deployment-policies.md) diff --git a/datacenter/dtr/2.4/guides/user/create-promotion-policies.md b/datacenter/dtr/2.4/guides/user/create-promotion-policies.md new file mode 100644 index 0000000000..2205fb6898 --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/create-promotion-policies.md @@ -0,0 +1,99 @@ +--- +title: Create promotion polices +description: Learn how to create a promotion policies that can automatically + promote an image to production if it passes all tests and doesn't have + vulnerabilities. +keywords: registry, promotion, pipeline +--- + +Once you've made changes to your application and want to make them available +to your users, you typically push an image to DTR, or have a CI/CD pipeline +that does it for you. A team responsible for QA will notice you've pushed +a new image, run tests, and if the image is working as expected, they'll +promote it to production. + +As an example, you push the image to `docker/website-dev:3-stable`, the QA team will +pull and test it, and push it as `docker/website-prod:latest`. + +DTR allows you to automate this. If the image you pushed to DTR meets certain +criteria, like it has a specific name, and doesn't have any vulnerabilities, +the image is automatically promoted. +You can combine multiple promotion criteria, and chain promotion rules, to +build complex deployment pipelines. + +![promotion example](../images/create-deployment-policies-1.svg) + +In this example, we're going to create a promotion policy for the +`docker/website-dev` repository. + +## Configure your repository + +In the DTR **web UI**, navigate to the **repository details** and +choose **Policies**. + +![repository policies](../images/create-deployment-policies-2.png){: .with-border} + +Click **New promotion policy**, and define that criteria that an image needs +to meet to be promoted. + +DTR allows defining the following criteria: + +| Name | Description | +|:----------------|:---------------------------------------------------| +| Tag name | If the tag name contains | +| Vulnerabilities | If the image has vulnerabilities | +| License | If the image uses an intellectual property license | + +Then, select where to push the image to if it meets all the criteria. +Select the **organization** and **repository** where the image is going to be +pushed, and define the **tag**. You can use these template keywords to define +your new tag: + +| Template | Description | Example result | +|:---------|:--------------------------------|:------------------| +| %n | The tag to promote | 1, 4.5, latest | +| %A | Day of the week | Sunday, Monday | +| %a | Day of the week, abbreviated | Sun, Mon, Tue | +| %w | Day of the week, as a number | 0, 1, 6 | +| %d | Number for the day of the month | 01, 15, 31 | +| %B | Month | January, December | +| %b | Month, abbreviated | Jan, Jun, Dec | +| %m | Month, as a number | 01, 06, 12 | +| %Y | Year | 1999, 2015, 2048 | +| %y | Year, two digits | 99, 15, 48 | +| %H | Hour, in 24 hour format | 00, 12, 23 | +| %I | Hour, in 12 hour format | 01, 10, 10 | +| %p | Period of the day | AM, PM | +| %M | Minute | 00, 10, 59 | +| %S | Second | 00, 10, 59 | +| %f | Microsecond | 000000, 999999 | +| %Z | Name for the timezone | UTC, PST, EST | +| %j | Day of the year | 001, 200, 366 | +| %W | Week of the year | 00, 10, 53 | + + + +In this example, if a tag in the `docker/website-dev` doesn't have +vulnerabilities and the tag name contains `stable`, we'll automatically +push that image to `docker/website-prod` and tag it with the timestamp of +when the image was promoted. + +![repository with policies](../images/create-deployment-policies-3.png){: .with-border} + +Everything is set up, and once we push a new image, if it complies with all +the policies, it automatically gets promoted. + +![tag promoted](../images/create-deployment-policies-4.png){: .with-border} + +## Create complex pipelines + +You can create several promotion policies in a repository, chain +promotion policies across different repositories, and also use promotion +policies with webhooks. This allows you to create flexible deployment +pipelines. + +Also, users don't need access to all repositories in the promotion pipeline. +A repository admin can define the promotion policies, and only +allow access to push to the first repository in that pipeline. Once users push +to the fist repository, the image gets promoted to the other repositories as +long as it satisfies the promotion policies. diff --git a/datacenter/dtr/2.4/guides/user/manage-images/delete-images.md b/datacenter/dtr/2.4/guides/user/manage-images/delete-images.md new file mode 100644 index 0000000000..d0ec51a545 --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/manage-images/delete-images.md @@ -0,0 +1,15 @@ +--- +title: Delete images +description: Learn how to delete images from Docker Trusted Registry. +keywords: registry, delete +--- + +To delete an image, go to the **DTR web UI**, and navigate to the image +**repository** you want to delete. In the **Tags** tab, select all the image +tags you want to delete, and click the **Delete** button. + +![](../../images/delete-images-1.png){: .with-border} + +You can also delete all image versions, by deleting the repository. For that, +in the image **repository**, navigate to the **Settings** tab, and click the +**Delete** button. diff --git a/datacenter/dtr/2.4/guides/user/manage-images/index.md b/datacenter/dtr/2.4/guides/user/manage-images/index.md new file mode 100644 index 0000000000..b8369d3c6e --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/manage-images/index.md @@ -0,0 +1,37 @@ +--- +title: Create a repository +description: Learn how to create new repositories in Docker Trusted Registry. +keywords: registry, repository +--- + +Since DTR is secure by default, you need to create the image repository before +being able to push the image to DTR. + +In this example, we'll create the 'golang' repository in DTR. + +## Create a repository + +To create a new repository, navigate to the **DTR web application**, and click +the **New repository** button. + +![](../../images/create-repository-1.png){: .with-border} + +Add a **name and description** for the repository, and choose whether your +repository is public or private: + + * Public repositories are visible to all users, but can only be changed by + users granted with permission to write them. + * Private repositories can only be seen by users that have been granted + permissions to that repository. + +![](../../images/create-repository-2.png){: .with-border} + +Click **Save** to create the repository. + +When creating a repository in DTR, the full name of the repository becomes +`//`. In this example, the full +name of our repository will be `dtr.example.org/dave.lauper/golang`. + +## Where to go next + +* [Pull and push images](pull-and-push-images.md) diff --git a/datacenter/dtr/2.4/guides/user/manage-images/prevent-tags-from-being-overwritten.md b/datacenter/dtr/2.4/guides/user/manage-images/prevent-tags-from-being-overwritten.md new file mode 100644 index 0000000000..435c44a253 --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/manage-images/prevent-tags-from-being-overwritten.md @@ -0,0 +1,41 @@ +--- +title: Prevent tags from being overwritten +description: Learn how to make your tags immutable and don't allow users to + overwrite a tag if it already exists +keywords: registry, immutable +--- + +{% assign domain="dtr.example.org" %} +{% assign org="library" %} +{% assign repo="wordpress" %} +{% assign tag="latest" %} + +By default, users with access to push to a repository, can push the same tag +multiple times to the same repository. +As an example, a user pushes an image to `{{ org }}/{{ repo }}:{{ tag }}`, and later another +user can push the image with exactly the same name but different functionality. +This might make it difficult to trace back the image to the build that generated +it. + +To prevent this from happening, you can configure a repository to be immutable. +Once you push a tag, DTR won't allow anyone else to push another tag with the same +name. + +## Make tags immutable + +To make tags immutable, in the **DTR web UI**, navigate to the +**repository settings** page, and change **Immutability** to **On**. + +![](../../images/immutable-repo-1.png){: .with-border} + +From now on, users will get an error message when trying to push a tag +that already exists: + +```none +docker push {{ domain }}/{{ org }}/{{ repo }}:{{ tag }} +unknown: tag={{ tag }} cannot be overwritten because {{ domain }}/{{ org }}/{{ repo }} is an immutable repository +``` + +## Where to go next + +* [Sign images](sign-images/index.md) diff --git a/datacenter/dtr/2.4/guides/user/manage-images/pull-and-push-images.md b/datacenter/dtr/2.4/guides/user/manage-images/pull-and-push-images.md new file mode 100644 index 0000000000..ddfd5c4c66 --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/manage-images/pull-and-push-images.md @@ -0,0 +1,95 @@ +--- +title: Pull and push images +description: Learn how to pull and push images to Docker Trusted Registry. +keywords: registry, push, pull +--- + +{% assign domain="dtr.example.org" %} +{% assign org="library" %} +{% assign repo="wordpress" %} +{% assign tag="latest" %} + +You interact with Docker Trusted registry in the same way you interact with +Docker Hub or any other registry: + +* `docker login `: authenticates you on DTR +* `docker pull :`: pulls an image from DTR +* `docker push :`: pushes an image to DTR + +## Pull an image + +Pulling an image from Docker Trusted Registry is the same as pulling an image +from Docker Hub or any other registry. Since DTR is secure by default, you +always need to authenticate before pulling images. + +In this example, DTR can be accessed at {{ domain }}, and the user +was granted permissions to access the NGINX, and Wordpress repositories. + +![](../../images/pull-push-images-1.png){: .with-border} + +Click on the repository to see its details. + +![](../../images/pull-push-images-2.png){: .with-border} + +To pull the {{ tag }} tag of the {{ org }}/{{ repo }} image, run: + +```bash +$ docker login {{ domain }} +$ docker pull {{ domain }}/{{ org }}/{{ repo }}:{{ tag }} +``` + +## Push an image + +Before you can push an image to DTR, you need to [create a repository](index.md) +to store the image. In this example the full name of our repository is +`{{ domain }}/{{ org }}/{{ repo }}`. + +### Tag the image + +In this example we'll pull the {{ repo }} image from Docker Hub and tag with +the full DTR and repository name. A tag defines where the image was pulled +from, and where it will be pushed to. + +```bash +# Pull from Docker Hub the {{ tag }} tag of the {{ repo }} image +$ docker pull {{ repo }}:{{ tag }} + +# Tag the {{ repo }}:{{ tag }} image with the full repository name we've created in DTR +$ docker tag {{ repo }}:{{ tag }} {{ domain }}/{{ org }}/{{ repo }}:{{ tag }} +``` + +### Push the image + +Now that you have tagged the image, you only need to authenticate and push the +image to DTR. + +```bash +$ docker login {{ domain }} +$ docker push {{ domain }}/{{ org }}/{{ repo }}:{{ tag }} +``` + +Go back to the **DTR web UI** to validate that the tag was successfully pushed. + +![](../../images/pull-push-images-3.png){: .with-border} + +### Windows images + +Official Microsoft Windows images or any image you create based on them aren't +distributable by default. When you push a Windows image to DTR, Docker only +pushes the image manifest but not the image layers. This means that: + +* DTR won't be able to scan those images for vulnerabilities since DTR doesn't +have access to the layers +* When a user pulls a Windows image from DTR, they are redirected to a +Microsoft registry to fetch the layers + +To configure Docker to always push Windows layers to DTR, add the following +to your `C:\ProgramData\docker\config\daemon.json` configuration file: + +``` +"allow-nondistributable-artifacts": [":"] +``` + +## Where to go next + +* [Delete images](delete-images.md) diff --git a/datacenter/dtr/2.4/guides/user/manage-images/scan-images-for-vulnerabilities.md b/datacenter/dtr/2.4/guides/user/manage-images/scan-images-for-vulnerabilities.md new file mode 100644 index 0000000000..e1201dd9fc --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/manage-images/scan-images-for-vulnerabilities.md @@ -0,0 +1,156 @@ +--- +title: Scan images for vulnerabilities +description: Learn how to scan your Docker images for vulnerabilities. +keywords: registry, scan, vulnerability +--- + +[![Image Security Scanning](../../images/scanning_video.png)](https://www.youtube.com/watch?v=121poCB0Nn8 "Images Security Scanning"){: target="_blank" ._} + +Docker Trusted Registry can scan images in your repositories to verify that they +are free from known security vulnerabilities or exposures, using Docker Security +Scanning. The results of these scans are reported for each image tag. + +Docker Security Scanning is available as an add-on to Docker Trusted Registry, +and an administrator configures it for your DTR instance. If you do not see +security scan results available on your repositories, your organization may not +have purchased the Security Scanning feature or it may be disabled. See [Set up +Security Scanning in DTR](../../admin/configure/set-up-vulnerability-scans.md) for more details. + +> **Tip**: Only users with write access to a repository can manually start a +scan. Users with read-only access can view the scan results, but cannot start +a new scan. + +## The Docker Security Scan process + +Scans run either on demand when a user clicks the **Start a Scan** links or +**Scan** button (see [Manual scanning](#manual-scanning) below), or automatically +on any `docker push` to the repository. + +First the scanner performs a binary scan on each layer of the image, identifies +the software components in each layer, and indexes the SHA of each component in +a bill-of-materials. A binary scan evaluates the components on a bit-by-bit +level, so vulnerable components are discovered even if they are +statically-linked or under a different name. + +The scan then compares the SHA of each component against the US National +Vulnerability Database that is installed on your DTR instance. When +this database is updated, DTR reviews the indexed components for newly +discovered vulnerabilities. + +DTR scans both Linux and Windows images, but but by default Docker doesn't push +foreign image layers for Windows images so DTR won't be able to scan them. If +you want DTR to scan your Windows images, [configure Docker to always push image +layers](pull-and-push-images.md), and it will scan the non-foreign layers. + +## Security scan on push + +By default, Docker Security Scanning runs automatically on `docker push` to an +image repository. + +If your DTR instance is configured in this way, you do not need to do anything +once your `docker push` completes. The scan runs automatically, and the results +are reported in the repository's **Images** tab after the scan finishes. + +## Manual scanning + +If your repository owner enabled Docker Security Scanning but disabled automatic +scanning, you can manually start a scan for images in repositories to which you +have `write` access. + +To start a security scan, navigate to the **tag details**, and click the **Scan** button. + +![](../../images/scan-images-for-vulns-1.png){: .with-border} + +DTR begins the scanning process. You will need to refresh the page to see the +results once the scan is complete. + +## Change the scanning mode + +You can change the scanning mode for each individual repository at any time. You +might want to disable scanning if you are pushing an image repeatedly during +troubleshooting and don't want to waste resources scanning and re-scanning, or +if a repository contains legacy code that is not used or updated frequently. + +> **Note**: To change an individual repository's scanning mode, you must have +`write` or `administrator` access to the repo. + +To change the repository scanning mode: + +1. Navigate to the repository, and click the **Settings** tab. +2. Scroll down to the **Image scanning** section. +3. Select the desired scanning mode. +![](../../images/scan-images-for-vulns-2.png){: .with-border} + +## View security scan results + +Once DTR has run a security scan for an image, you can view the results. + +The **Images** tab for each repository includes a summary of the most recent +scan results for each image. + +![](../../images/scan-images-for-vulns-3.png){: .with-border} +- A green shield icon with a check mark indicates that the scan did not find +any vulnerabilities. +- A red or orange shield icon indicates that vulnerabilities were found, and +the number of vulnerabilities is included on that same line. + +If the vulnerability scan can't detect the version of a component, it reports +the vulnerabilities for all versions of that component. + +From the **Images** tab you can click **View details** for a specific tag to see +the full scan results. The top of the page also includes metadata about the +image, including the SHA, image size, date last pushed and user who last pushed, +the security scan summary, and the security scan progress. + +The scan results for each image include two different modes so you can quickly +view details about the image, its components, and any vulnerabilities found. + +- The **Layers** view lists the layers of the image in order as they are built +by the Dockerfile. + + This view can help you find exactly which command in the build introduced + the vulnerabilities, and which components are associated with that single + command. Click a layer to see a summary of its components. You can then + click on a component to switch to the Component view and get more details + about the specific item. + + > **Tip**: The layers view can be long, so be sure + to scroll down if you don't immediately see the reported vulnerabilities. + + ![](../../images/scan-images-for-vulns-4.png){: .with-border} + +- The **Components** view lists the individual component libraries indexed by +the scanning system, in order of severity and number of vulnerabilities found, +most vulnerable first. + + Click on an individual component to view details about the vulnerability it + introduces, including a short summary and a link to the official CVE + database report. A single component can have multiple vulnerabilities, and + the scan report provides details on each one. The component details also + include the license type used by the component, and the filepath to the + component in the image. +![](../../images/scan-images-for-vulns-5.png){: .with-border} + +## What to do next + +If you find that an image in your registry contains vulnerable components, you +can use the linked CVE scan information in each scan report to evaluate the +vulnerability and decide what to do. + +If you discover vulnerable components, you should check if there is an updated +version available where the security vulnerability has been addressed. If +necessary, you might contact the component's maintainers to ensure that the +vulnerability is being addressed in a future version or patch update. + +If the vulnerability is in a `base layer` (such as an operating system) you +might not be able to correct the issue in the image. In this case, you might +switch to a different version of the base layer, or you might find an +equivalent, less vulnerable base layer. You might also decide that the +vulnerability or exposure is acceptable. + +Address vulnerabilities in your repositories by updating the images to use +updated and corrected versions of vulnerable components, or by using a different +components that provide the same functionality. When you have updated the source +code, run a build to create a new image, tag the image, and push the updated +image to your DTR instance. You can then re-scan the image to confirm that you +have addressed the vulnerabilities. diff --git a/datacenter/dtr/2.4/guides/user/manage-images/sign-images/delegate-image-signing.md b/datacenter/dtr/2.4/guides/user/manage-images/sign-images/delegate-image-signing.md new file mode 100644 index 0000000000..296343ff4d --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/manage-images/sign-images/delegate-image-signing.md @@ -0,0 +1,72 @@ +--- +title: Delegate image signing +description: Learn how to grant permission for others to sign images in Docker Trusted Registry. +keywords: registry, sign, trust +--- + +Instead of signing all the images yourself, you can delegate that task +to other users. + +A typical workflow looks like this: + +1. A repository owner creates a repository in DTR, and initializes the trust +metadata for that repository +3. Team members download a UCP client bundle and share their public key +certificate with the repository owner +4. The repository owner delegates signing to the team members +5. Team members can sign images using the private keys in their UCP client +bundles + +In this example, the IT ops team creates and initializes trust for the +`dev/nginx`. Then they allow users in the QA team to push and sign images in +that repository. + +![teams](../../../images/delegate-image-signing-1.svg) + +## Create a repository and initialize trust + +A member of the IT ops team starts by configuring their +[Notary CLI client](../../access-dtr/configure-your-notary-client.md). + +Then they create the `dev/nginx` repository, +[initialize the trust metadata](index.md) for that repository, and grant +write access to members of the QA team, so that they can push images to that +repository. + +## Ask for the public key certificates + +The member of the IT ops team then asks the QA team for their public key +certificate files that are part of their UCP client bundle. + +If they don't have a UCP client bundle, +[they can download a new one](/datacenter/ucp/2.2/guides/user/access-ucp/cli-based-access.md). + +## Delegate image signing + +When delegating trust, you associate a public key certificate with a role name. +UCP requires that you delegate trust to two different roles: + +* `targets/releases` +* `targets/`, where `` is the UCP team the user belongs to + +In this example we'll delegate trust to `targets/releases` and `targets/qa`: + +```none +# Delegate trust, and add that public key with the role targets/releases +notary delegation add --publish \ + dtr.example.org/dev/nginx targets/releases \ + --all-paths + +# Delegate trust, and add that public key with the role targets/admin +notary delegation add --publish \ + dtr.example.org/dev/nginx targets/qa \ + --all-paths +``` + +Now members from the QA team just have to [configure their Notary CLI client +with UCP private keys](../../access-dtr/configure-your-notary-client.md) +to be able to [push and sign images](index.md) into the `dev/nginx` repository. + +## Where to go next + +* [Manage trusted repositories](manage-trusted-repositories.md) diff --git a/datacenter/dtr/2.4/guides/user/manage-images/sign-images/index.md b/datacenter/dtr/2.4/guides/user/manage-images/sign-images/index.md new file mode 100644 index 0000000000..883db9eaa8 --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/manage-images/sign-images/index.md @@ -0,0 +1,170 @@ +--- +title: Sign an image +description: Learn how to sign the images you push to Docker Trusted Registry. +keywords: registry, sign, trust +--- + +By default, when you push an image to DTR, the Docker CLI client doesn't +sign the image. + +![image without signature](../../../images/sign-an-image-1.svg) + +You can configure the Docker CLI client to sign the images you push to DTR. +This allows whoever pulls your image to validate if they are getting the image +you created, or a forged one. + +To sign an image, you can run: + +```none +export DOCKER_CONTENT_TRUST=1 +docker push //: +``` + +This pushes the image to DTR and creates trust metadata. It also creates +public and private key pairs to sign the trust metadata, and pushes that metadata +to the Notary Server internal to DTR. + +![image with signature](../../../images/sign-an-image-2.svg) + + +## Sign images that UCP can trust + +With the command above you'll be able to sign your DTR images, but UCP won't +trust them because it can't tie the private key you're using to sign the images +to your UCP account. + +To sign images in a way that UCP trusts them, you need to: + +* Configure your Notary client +* Initialize trust metadata for the repository +* Delegate signing to the keys in your UCP client bundle + +In this example we're going to pull an NGINX image from Docker Store, +re-tag it as `dtr.example.org/dev/nginx:1`, push the image to DTR and sign it +in a way that is trusted by UCP. If you manage multiple repositories, you'll +have to do the same procedure for every one of them. + +### Configure your Notary client + +Start by [configuring your Notary client](../../access-dtr/configure-your-notary-client.md). +This ensures the Docker an Notary CLI clients know about your UCP private keys. + +### Initialize the trust metadata + +Then you need to initialize the trust metadata for the new repository, and +the easiest way to do it is by pushing an image to that repository. Navigate to +the **DTR web UI**, and create a repository for your image. +In this example we've created the `dev/nginx` repository. + +From the Docker CLI client, pull an NGINX image from Docker Store, +re-tag it, sign and push it to DTR. + +```bash +# Pull NGINX from Docker Store +docker pull nginx:latest + +# Re-tag NGINX +docker tag nginx:latest dtr.example.org/dev/nginx:1 + +# Log into DTR +docker login dtr.example.org + +# Sign and push the image to DTR +export DOCKER_CONTENT_TRUST=1 +docker push dtr.example.org/dev/nginx:1 +``` + +This pushes the image to DTR and initializes the trust metadata for that +repository. + +![DTR](../../../images/sign-an-image-3.png){: .with-border} + +DTR shows that the image is signed, but UCP won't trust the image +because it doesn't have any information about the private keys used to sign +the image. + +### Delegate trust to your UCP keys + +To sign images in a way that is trusted by UCP, you need to delegate trust, so +that you can sign images with the private keys in your UCP client bundle. + +When delegating trust you associate a public key certificate with a role name. +UCP requires that you delegate trust to two different roles: + +* `targets/releases` +* `targets/`, where `` is the UCP team the user belongs to + +In this example we'll delegate trust to `targets/releases` and `targets/admin`: + +```none +# Delegate trust, and add that public key with the role targets/releases +notary delegation add --publish \ + dtr.example.org/dev/nginx targets/releases \ + --all-paths + +# Delegate trust, and add that public key with the role targets/admin +notary delegation add --publish \ + dtr.example.org/dev/nginx targets/admin \ + --all-paths +``` + +To push the new signing metadata to the Notary server, you'll have to push +the image again: + +```none +docker push dtr.example.org/dev/nginx:1 +``` + +## Under the hood + +Both Docker and Notary CLI clients interact with the Notary server to: + +* Keep track of the metadata of signed images +* Validate the signatures of the images you pull + +This metadata is also kept locally in `~/.docker/trust`. + +```none +. +|-- private +| |-- root_keys +| | `-- 993ad247476da081e45fdb6c28edc4462f0310a55da4acf1e08404c551d94c14.key +| `-- tuf_keys +| `-- dtr.example.org +| `-- dev +| `-- nginx +| |-- 98a93b2e52c594de4d13d7268a4a5f28ade5fc1cb5f44cc3a4ab118572a86848.key +| `-- f7917aef77d0d4bf8204af78c0716dac6649346ebea1c4cde7a1bfa363c502ce.key +`-- tuf + `-- dtr.example.org + `-- dev + `-- nginx + |-- changelist + `-- metadata + |-- root.json + |-- snapshot.json + |-- targets.json + `-- timestamp.json +``` + +The `private` directory contains the private keys the Docker CLI client uses +to sign the images. Make sure you create backups of this directory so that +you don't lose your signing keys. + +The Docker and Notary CLI clients integrate with Yubikey. If you have a Yubikey +plugged in when initializing trust for a repository, the root key is stored on +the Yubikey instead of in the trust directory. +When you run any command that needs the `root` key, Docker and Notary CLI +clients look on the Yubikey first, and use the trust directory as a fallback. + +The `tuf` directory contains the trust metadata for the images you've +signed. For each repository there are four files. + +| File | Description | +|:-----------------|:--------------------------------------------------------------------------------------------------------------------------| +| `root.json` | Has data about other keys and their roles. This data is signed by the root key. | +| `targets.json` | Has data about the digest and size for an image. This data is signed by the target key. | +| `snapshot.json` | Has data about the version number of the root.json and targets.json files. This data is signed by the snapshot key. | +| `timestamp.json` | Has data about the digest, size, and version number for the snapshot.json file. This data is signed by the timestamp key. | + +[Learn more about trust metadata](/notary/service_architecture.md). diff --git a/datacenter/dtr/2.4/guides/user/manage-images/sign-images/manage-trusted-repositories.md b/datacenter/dtr/2.4/guides/user/manage-images/sign-images/manage-trusted-repositories.md new file mode 100644 index 0000000000..f65a384dbd --- /dev/null +++ b/datacenter/dtr/2.4/guides/user/manage-images/sign-images/manage-trusted-repositories.md @@ -0,0 +1,152 @@ +--- +title: Manage trusted repositories +description: Learn how to use the Notary CLI client to manage trusted repositories +keywords: dtr, trust, notary, security +--- + +Once you +[configure the Notary CLI client](../../access-dtr/configure-your-notary-client.md), +you can use it to manage your private keys, list trust data from any repository +you have access to, authorize other team members to sign images, and rotate +keys if a private key has been compromised. + +## List trust data + +List the trust data for a repository by running: + +```none +$ notary list // +``` + +You can get one of the following errors, or a list with the images that have +been signed: + +| Message | Description | +|:--------------------------------------------|:-----------------------------------------------------------------------------------------------------------------| +| `fatal: client is offline` | Either the repository server can't be reached, or your Notary CLI client is misconfigured | +| `fatal: does not have trust data` | There's no trust data for the repository. Either run `notary init` or sign and push an image to that repository. | +| `No targets present in this repository` | The repository has been initialized, but doesn't contain any signed images | + +## Initialize trust for a repository + +There's two ways to initialize trust data for a repository. You can either +sign and push an image to that repository: + +```none +export DOCKER_CONTENT_TRUST=1 +docker push // +``` + +or + +``` +notary init --publish // +``` + +## Manage staged changes + +The Notary CLI client stages changes before publishing them to the server. +You can manage the changes that are staged by running: + +```bash +# Check what changes are staged +$ notary status // + +# Unstage a specific change +$ notary status // --unstage 0 + +# Alternatively, unstage all changes +$ notary status // --reset +``` + +When you're ready to publish your changes to the Notary server, run: + +```bash +$ notary publish // +``` + +## Delete trust data + +Administrator users can remove all signatures from a trusted repository by +running: + +```bash +$ notary delete // --remote +``` + +If you don't include the `--remote` flag, Notary deletes local cached content +but will not delete data from the Notary server. + + +## Change the passphrase for a key + +The Notary CLI client manages the keys used to sign the image metadata. To +list all the keys managed by the Notary CLI client, run: + +```bash +$ notary key list +``` + +To change the passphrase used to encrypt one of the keys, run: + +```bash +$ notary key passwd +``` + +## Rotate keys + +If one of the private keys is compromised you can rotate that key, so that +images that were signed with the key stop being trusted. + +For keys that are kept offline and managed by the Notary CLI client, such the +keys with the root, targets, and snapshot roles, you can rotate them with: + +```bash +$ notary key rotate // +``` + +The Notary CLI client generates a new key for the role you specified, and +prompts you for a passphrase to encrypt it. +Then you're prompted for the passphrase for the key you're rotating, and if it +is correct, the Notary CLI client contacts the Notary server to publish the +change. + +You can also rotate keys that are stored in the Notary server, such as the keys +with the snapshot or timestamp role. For that, run: + +```bash +$ notary key rotate // --server-managed +``` + +## Manage keys for delegation roles + +To delegate image signing to other UCP users, get the `cert.pem` file that's +included in their client bundle and run: + +```bash +$ notary delegation add -p // targets/ --all-paths user1.pem user2.pem +``` + +You can also remove keys from a delegation role: + +```bash +# Remove the given keys from a delegation role +$ notary delegation remove -p // targets/ + +# Alternatively, you can remove keys from all delegation roles +$ notary delegation purge // --key --key +``` + +## Troubleshooting + +Notary CLI has a `-D` flag that you can use to increase the logging level. You +can use this for troubleshooting. + +Usually most problems are fixed by ensuring you're communicating with the +correct Notary server, using the `-s` flag, and that you're using the correct +directory where your private keys are stored, with the `-d` flag. + +## Where to go next + +* [Learn more about Notary](/notary/advanced_usage.md) +* [Notary architecture](/notary/service_architecture.md) diff --git a/datacenter/dtr/2.4/reference/api/css/print.css b/datacenter/dtr/2.4/reference/api/css/print.css new file mode 100644 index 0000000000..cd3aa8b6a4 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/css/print.css @@ -0,0 +1,1172 @@ +/* Original style from softwaremaniacs.org (c) Ivan Sagalaev */ +.swagger-section pre code { + display: block; + padding: 0.5em; + background: #F0F0F0; +} +.swagger-section pre code, +.swagger-section pre .subst, +.swagger-section pre .tag .title, +.swagger-section pre .lisp .title, +.swagger-section pre .clojure .built_in, +.swagger-section pre .nginx .title { + color: black; +} +.swagger-section pre .string, +.swagger-section pre .title, +.swagger-section pre .constant, +.swagger-section pre .parent, +.swagger-section pre .tag .value, +.swagger-section pre .rules .value, +.swagger-section pre .rules .value .number, +.swagger-section pre .preprocessor, +.swagger-section pre .ruby .symbol, +.swagger-section pre .ruby .symbol .string, +.swagger-section pre .aggregate, +.swagger-section pre .template_tag, +.swagger-section pre .django .variable, +.swagger-section pre .smalltalk .class, +.swagger-section pre .addition, +.swagger-section pre .flow, +.swagger-section pre .stream, +.swagger-section pre .bash .variable, +.swagger-section pre .apache .tag, +.swagger-section pre .apache .cbracket, +.swagger-section pre .tex .command, +.swagger-section pre .tex .special, +.swagger-section pre .erlang_repl .function_or_atom, +.swagger-section pre .markdown .header { + color: #800; +} +.swagger-section pre .comment, +.swagger-section pre .annotation, +.swagger-section pre .template_comment, +.swagger-section pre .diff .header, +.swagger-section pre .chunk, +.swagger-section pre .markdown .blockquote { + color: #888; +} +.swagger-section pre .number, +.swagger-section pre .date, +.swagger-section pre .regexp, +.swagger-section pre .literal, +.swagger-section pre .smalltalk .symbol, +.swagger-section pre .smalltalk .char, +.swagger-section pre .go .constant, +.swagger-section pre .change, +.swagger-section pre .markdown .bullet, +.swagger-section pre .markdown .link_url { + color: #080; +} +.swagger-section pre .label, +.swagger-section pre .javadoc, +.swagger-section pre .ruby .string, +.swagger-section pre .decorator, +.swagger-section pre .filter .argument, +.swagger-section pre .localvars, +.swagger-section pre .array, +.swagger-section pre .attr_selector, +.swagger-section pre .important, +.swagger-section pre .pseudo, +.swagger-section pre .pi, +.swagger-section pre .doctype, +.swagger-section pre .deletion, +.swagger-section pre .envvar, +.swagger-section pre .shebang, +.swagger-section pre .apache .sqbracket, +.swagger-section pre .nginx .built_in, +.swagger-section pre .tex .formula, +.swagger-section pre .erlang_repl .reserved, +.swagger-section pre .prompt, +.swagger-section pre .markdown .link_label, +.swagger-section pre .vhdl .attribute, +.swagger-section pre .clojure .attribute, +.swagger-section pre .coffeescript .property { + color: #8888ff; +} +.swagger-section pre .keyword, +.swagger-section pre .id, +.swagger-section pre .phpdoc, +.swagger-section pre .title, +.swagger-section pre .built_in, +.swagger-section pre .aggregate, +.swagger-section pre .css .tag, +.swagger-section pre .javadoctag, +.swagger-section pre .phpdoc, +.swagger-section pre .yardoctag, +.swagger-section pre .smalltalk .class, +.swagger-section pre .winutils, +.swagger-section pre .bash .variable, +.swagger-section pre .apache .tag, +.swagger-section pre .go .typename, +.swagger-section pre .tex .command, +.swagger-section pre .markdown .strong, +.swagger-section pre .request, +.swagger-section pre .status { + font-weight: bold; +} +.swagger-section pre .markdown .emphasis { + font-style: italic; +} +.swagger-section pre .nginx .built_in { + font-weight: normal; +} +.swagger-section pre .coffeescript .javascript, +.swagger-section pre .javascript .xml, +.swagger-section pre .tex .formula, +.swagger-section pre .xml .javascript, +.swagger-section pre .xml .vbscript, +.swagger-section pre .xml .css, +.swagger-section pre .xml .cdata { + opacity: 0.5; +} +.swagger-section .swagger-ui-wrap { + line-height: 1; + font-family: "Droid Sans", sans-serif; + max-width: 960px; + margin-left: auto; + margin-right: auto; +} +.swagger-section .swagger-ui-wrap b, +.swagger-section .swagger-ui-wrap strong { + font-family: "Droid Sans", sans-serif; + font-weight: bold; +} +.swagger-section .swagger-ui-wrap q, +.swagger-section .swagger-ui-wrap blockquote { + quotes: none; +} +.swagger-section .swagger-ui-wrap p { + line-height: 1.4em; + padding: 0 0 10px; + color: #333333; +} +.swagger-section .swagger-ui-wrap q:before, +.swagger-section .swagger-ui-wrap q:after, +.swagger-section .swagger-ui-wrap blockquote:before, +.swagger-section .swagger-ui-wrap blockquote:after { + content: none; +} +.swagger-section .swagger-ui-wrap .heading_with_menu h1, +.swagger-section .swagger-ui-wrap .heading_with_menu h2, +.swagger-section .swagger-ui-wrap .heading_with_menu h3, +.swagger-section .swagger-ui-wrap .heading_with_menu h4, +.swagger-section .swagger-ui-wrap .heading_with_menu h5, +.swagger-section .swagger-ui-wrap .heading_with_menu h6 { + display: block; + clear: none; + float: left; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + width: 60%; +} +.swagger-section .swagger-ui-wrap table { + border-collapse: collapse; + border-spacing: 0; +} +.swagger-section .swagger-ui-wrap table thead tr th { + padding: 5px; + font-size: 0.9em; + color: #666666; + border-bottom: 1px solid #999999; +} +.swagger-section .swagger-ui-wrap table tbody tr:last-child td { + border-bottom: none; +} +.swagger-section .swagger-ui-wrap table tbody tr.offset { + background-color: #f0f0f0; +} +.swagger-section .swagger-ui-wrap table tbody tr td { + padding: 6px; + font-size: 0.9em; + border-bottom: 1px solid #cccccc; + vertical-align: top; + line-height: 1.3em; +} +.swagger-section .swagger-ui-wrap ol { + margin: 0px 0 10px; + padding: 0 0 0 18px; + list-style-type: decimal; +} +.swagger-section .swagger-ui-wrap ol li { + padding: 5px 0px; + font-size: 0.9em; + color: #333333; +} +.swagger-section .swagger-ui-wrap ol, +.swagger-section .swagger-ui-wrap ul { + list-style: none; +} +.swagger-section .swagger-ui-wrap h1 a, +.swagger-section .swagger-ui-wrap h2 a, +.swagger-section .swagger-ui-wrap h3 a, +.swagger-section .swagger-ui-wrap h4 a, +.swagger-section .swagger-ui-wrap h5 a, +.swagger-section .swagger-ui-wrap h6 a { + text-decoration: none; +} +.swagger-section .swagger-ui-wrap h1 a:hover, +.swagger-section .swagger-ui-wrap h2 a:hover, +.swagger-section .swagger-ui-wrap h3 a:hover, +.swagger-section .swagger-ui-wrap h4 a:hover, +.swagger-section .swagger-ui-wrap h5 a:hover, +.swagger-section .swagger-ui-wrap h6 a:hover { + text-decoration: underline; +} +.swagger-section .swagger-ui-wrap h1 span.divider, +.swagger-section .swagger-ui-wrap h2 span.divider, +.swagger-section .swagger-ui-wrap h3 span.divider, +.swagger-section .swagger-ui-wrap h4 span.divider, +.swagger-section .swagger-ui-wrap h5 span.divider, +.swagger-section .swagger-ui-wrap h6 span.divider { + color: #aaaaaa; +} +.swagger-section .swagger-ui-wrap a { + color: #547f00; +} +.swagger-section .swagger-ui-wrap a img { + border: none; +} +.swagger-section .swagger-ui-wrap article, +.swagger-section .swagger-ui-wrap aside, +.swagger-section .swagger-ui-wrap details, +.swagger-section .swagger-ui-wrap figcaption, +.swagger-section .swagger-ui-wrap figure, +.swagger-section .swagger-ui-wrap footer, +.swagger-section .swagger-ui-wrap header, +.swagger-section .swagger-ui-wrap hgroup, +.swagger-section .swagger-ui-wrap menu, +.swagger-section .swagger-ui-wrap nav, +.swagger-section .swagger-ui-wrap section, +.swagger-section .swagger-ui-wrap summary { + display: block; +} +.swagger-section .swagger-ui-wrap pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #fcf6db; + border: 1px solid #e5e0c6; + padding: 10px; +} +.swagger-section .swagger-ui-wrap pre code { + line-height: 1.6em; + background: none; +} +.swagger-section .swagger-ui-wrap .content > .content-type > div > label { + clear: both; + display: block; + color: #0F6AB4; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +.swagger-section .swagger-ui-wrap .content pre { + font-size: 12px; + margin-top: 5px; + padding: 5px; +} +.swagger-section .swagger-ui-wrap .icon-btn { + cursor: pointer; +} +.swagger-section .swagger-ui-wrap .info_title { + padding-bottom: 10px; + font-weight: bold; + font-size: 25px; +} +.swagger-section .swagger-ui-wrap .footer { + margin-top: 20px; +} +.swagger-section .swagger-ui-wrap p.big, +.swagger-section .swagger-ui-wrap div.big p { + font-size: 1em; + margin-bottom: 10px; +} +.swagger-section .swagger-ui-wrap form.fullwidth ol li.string input, +.swagger-section .swagger-ui-wrap form.fullwidth ol li.url input, +.swagger-section .swagger-ui-wrap form.fullwidth ol li.text textarea, +.swagger-section .swagger-ui-wrap form.fullwidth ol li.numeric input { + width: 500px !important; +} +.swagger-section .swagger-ui-wrap .info_license { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .info_tos { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .message-fail { + color: #cc0000; +} +.swagger-section .swagger-ui-wrap .info_url { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .info_email { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .info_name { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .info_description { + padding-bottom: 10px; + font-size: 15px; +} +.swagger-section .swagger-ui-wrap .markdown ol li, +.swagger-section .swagger-ui-wrap .markdown ul li { + padding: 3px 0px; + line-height: 1.4em; + color: #333333; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input, +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input, +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input { + display: block; + padding: 4px; + width: auto; + clear: both; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input.title, +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input.title, +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input.title { + font-size: 1.3em; +} +.swagger-section .swagger-ui-wrap table.fullwidth { + width: 100%; +} +.swagger-section .swagger-ui-wrap .model-signature { + font-family: "Droid Sans", sans-serif; + font-size: 1em; + line-height: 1.5em; +} +.swagger-section .swagger-ui-wrap .model-signature .signature-nav a { + text-decoration: none; + color: #AAA; +} +.swagger-section .swagger-ui-wrap .model-signature .signature-nav a:hover { + text-decoration: underline; + color: black; +} +.swagger-section .swagger-ui-wrap .model-signature .signature-nav .selected { + color: black; + text-decoration: none; +} +.swagger-section .swagger-ui-wrap .model-signature .propType { + color: #5555aa; +} +.swagger-section .swagger-ui-wrap .model-signature pre:hover { + background-color: #ffffdd; +} +.swagger-section .swagger-ui-wrap .model-signature pre { + font-size: .85em; + line-height: 1.2em; + overflow: auto; + max-height: 200px; + cursor: pointer; +} +.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav { + display: block; + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li:last-child { + padding-right: 0; + border-right: none; +} +.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li { + float: left; + margin: 0 5px 5px 0; + padding: 2px 5px 2px 0; + border-right: 1px solid #ddd; +} +.swagger-section .swagger-ui-wrap .model-signature .propOpt { + color: #555; +} +.swagger-section .swagger-ui-wrap .model-signature .snippet small { + font-size: 0.75em; +} +.swagger-section .swagger-ui-wrap .model-signature .propOptKey { + font-style: italic; +} +.swagger-section .swagger-ui-wrap .model-signature .description .strong { + font-weight: bold; + color: #000; + font-size: .9em; +} +.swagger-section .swagger-ui-wrap .model-signature .description div { + font-size: 0.9em; + line-height: 1.5em; + margin-left: 1em; +} +.swagger-section .swagger-ui-wrap .model-signature .description .stronger { + font-weight: bold; + color: #000; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper { + border-spacing: 0; + position: absolute; + background-color: #ffffff; + border: 1px solid #bbbbbb; + display: none; + font-size: 11px; + max-width: 400px; + line-height: 30px; + color: black; + padding: 5px; + margin-left: 10px; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper th { + text-align: center; + background-color: #eeeeee; + border: 1px solid #bbbbbb; + font-size: 11px; + color: #666666; + font-weight: bold; + padding: 5px; + line-height: 15px; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper .optionName { + font-weight: bold; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown > p:first-child, +.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown > p:last-child { + display: inline; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown > p:not(:first-child):before { + display: block; + content: ''; +} +.swagger-section .swagger-ui-wrap .model-signature .description span:last-of-type.propDesc.markdown > p:only-child { + margin-right: -3px; +} +.swagger-section .swagger-ui-wrap .model-signature .propName { + font-weight: bold; +} +.swagger-section .swagger-ui-wrap .model-signature .signature-container { + clear: both; +} +.swagger-section .swagger-ui-wrap .body-textarea { + width: 300px; + height: 100px; + border: 1px solid #aaa; +} +.swagger-section .swagger-ui-wrap .markdown p code, +.swagger-section .swagger-ui-wrap .markdown li code { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #f0f0f0; + color: black; + padding: 1px 3px; +} +.swagger-section .swagger-ui-wrap .required { + font-weight: bold; +} +.swagger-section .swagger-ui-wrap input.parameter { + width: 300px; + border: 1px solid #aaa; +} +.swagger-section .swagger-ui-wrap h1 { + color: black; + font-size: 1.5em; + line-height: 1.3em; + padding: 10px 0 10px 0; + font-family: "Droid Sans", sans-serif; + font-weight: bold; +} +.swagger-section .swagger-ui-wrap .heading_with_menu { + float: none; + clear: both; + overflow: hidden; + display: block; +} +.swagger-section .swagger-ui-wrap .heading_with_menu ul { + display: block; + clear: none; + float: right; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + margin-top: 10px; +} +.swagger-section .swagger-ui-wrap h2 { + color: black; + font-size: 1.3em; + padding: 10px 0 10px 0; +} +.swagger-section .swagger-ui-wrap h2 a { + color: black; +} +.swagger-section .swagger-ui-wrap h2 span.sub { + font-size: 0.7em; + color: #999999; + font-style: italic; +} +.swagger-section .swagger-ui-wrap h2 span.sub a { + color: #777777; +} +.swagger-section .swagger-ui-wrap span.weak { + color: #666666; +} +.swagger-section .swagger-ui-wrap .message-success { + color: #89BF04; +} +.swagger-section .swagger-ui-wrap caption, +.swagger-section .swagger-ui-wrap th, +.swagger-section .swagger-ui-wrap td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} +.swagger-section .swagger-ui-wrap .code { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.text textarea { + font-family: "Droid Sans", sans-serif; + height: 250px; + padding: 4px; + display: block; + clear: both; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.select select { + display: block; + clear: both; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean { + float: none; + clear: both; + overflow: hidden; + display: block; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean label { + display: block; + float: left; + clear: none; + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean input { + display: block; + float: left; + clear: none; + margin: 0 5px 0 0; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.required label { + color: black; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label { + display: block; + clear: both; + width: auto; + padding: 0 0 3px; + color: #666666; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label abbr { + padding-left: 3px; + color: #888888; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li p.inline-hints { + margin-left: 0; + font-style: italic; + font-size: 0.9em; + margin: 0; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.buttons { + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap span.blank, +.swagger-section .swagger-ui-wrap span.empty { + color: #888888; + font-style: italic; +} +.swagger-section .swagger-ui-wrap .markdown h3 { + color: #547f00; +} +.swagger-section .swagger-ui-wrap .markdown h4 { + color: #666666; +} +.swagger-section .swagger-ui-wrap .markdown pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #fcf6db; + border: 1px solid #e5e0c6; + padding: 10px; + margin: 0 0 10px 0; +} +.swagger-section .swagger-ui-wrap .markdown pre code { + line-height: 1.6em; +} +.swagger-section .swagger-ui-wrap div.gist { + margin: 20px 0 25px 0 !important; +} +.swagger-section .swagger-ui-wrap ul#resources { + font-family: "Droid Sans", sans-serif; + font-size: 0.9em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource { + border-bottom: 1px solid #dddddd; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading h2 a, +.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading h2 a { + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading ul.options li a, +.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading ul.options li a { + color: #555555; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource:last-child { + border-bottom: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading { + border: 1px solid transparent; + float: none; + clear: both; + overflow: hidden; + display: block; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 14px 10px 0 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; + color: #666666; + font-size: 0.9em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a { + color: #aaaaaa; + text-decoration: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover { + text-decoration: underline; + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:active, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a.active { + text-decoration: underline; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:first-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.first { + padding-left: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options:first-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options.first { + padding-left: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 { + color: #999999; + padding-left: 0; + display: block; + clear: none; + float: left; + font-family: "Droid Sans", sans-serif; + font-weight: bold; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a { + color: #999999; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover { + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0 0 10px; + padding: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 { + display: block; + clear: none; + float: left; + width: auto; + margin: 0; + padding: 0; + line-height: 1.1em; + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path { + padding-left: 10px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a { + color: black; + text-decoration: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a:hover { + text-decoration: underline; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.http_method a { + text-transform: uppercase; + text-decoration: none; + color: white; + display: inline-block; + width: 50px; + font-size: 0.7em; + text-align: center; + padding: 7px 0 4px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span { + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 6px 10px 0 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + font-size: 0.9em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a { + text-decoration: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li.access { + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content { + border-top: none; + padding: 10px; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + -o-border-bottom-left-radius: 6px; + -ms-border-bottom-left-radius: 6px; + -khtml-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + -o-border-bottom-right-radius: 6px; + -ms-border-bottom-right-radius: 6px; + -khtml-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + margin: 0 0 20px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content h4 { + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header { + float: none; + clear: both; + overflow: hidden; + display: block; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header a { + padding: 4px 0 0 10px; + display: inline-block; + font-size: 0.9em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header input.submit { + display: block; + clear: none; + float: left; + padding: 6px 8px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header span.response_throbber { + background-image: url('../images/throbber.gif'); + width: 128px; + height: 16px; + display: block; + clear: none; + float: right; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form input[type='text'].error { + outline: 2px solid black; + outline-color: #cc0000; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.response div.block pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + padding: 10px; + font-size: 0.9em; + max-height: 400px; + overflow-y: auto; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading { + background-color: #f9f2e9; + border: 1px solid #f0e0ca; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a { + background-color: #c5862b; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #f0e0ca; + color: #c5862b; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a { + color: #c5862b; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content { + background-color: #faf5ee; + border: 1px solid #f0e0ca; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4 { + color: #c5862b; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header a { + color: #dcb67f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading { + background-color: #fcffcd; + border: 1px solid black; + border-color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #ffd20f; + color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a { + color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content { + background-color: #fcffcd; + border: 1px solid black; + border-color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content h4 { + color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header a { + color: #6fc992; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading { + background-color: #f5e8e8; + border: 1px solid #e8c6c7; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #a41e22; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #e8c6c7; + color: #a41e22; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a { + color: #a41e22; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content { + background-color: #f7eded; + border: 1px solid #e8c6c7; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4 { + color: #a41e22; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header a { + color: #c8787a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading { + background-color: #e7f6ec; + border: 1px solid #c3e8d1; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a { + background-color: #10a54a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #c3e8d1; + color: #10a54a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a { + color: #10a54a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content { + background-color: #ebf7f0; + border: 1px solid #c3e8d1; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4 { + color: #10a54a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header a { + color: #6fc992; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading { + background-color: #FCE9E3; + border: 1px solid #F5D5C3; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a { + background-color: #D38042; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #f0cecb; + color: #D38042; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a { + color: #D38042; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content { + background-color: #faf0ef; + border: 1px solid #f0cecb; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4 { + color: #D38042; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header a { + color: #dcb67f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading { + background-color: #e7f0f7; + border: 1px solid #c3d9ec; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a { + background-color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #c3d9ec; + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a { + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content { + background-color: #ebf3f9; + border: 1px solid #c3d9ec; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4 { + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header a { + color: #6fa5d2; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading { + background-color: #e7f0f7; + border: 1px solid #c3d9ec; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading h3 span.http_method a { + background-color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #c3d9ec; + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li a { + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content { + background-color: #ebf3f9; + border: 1px solid #c3d9ec; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content h4 { + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content div.sandbox_header a { + color: #6fa5d2; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content { + border-top: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:hover, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:active, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a.active { + text-decoration: underline; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li:first-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li.first { + padding-left: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations:first-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations.first { + padding-left: 0; +} +.swagger-section .swagger-ui-wrap p#colophon { + margin: 0 15px 40px 15px; + padding: 10px 0; + font-size: 0.8em; + border-top: 1px solid #dddddd; + font-family: "Droid Sans", sans-serif; + color: #999999; + font-style: italic; +} +.swagger-section .swagger-ui-wrap p#colophon a { + text-decoration: none; + color: #547f00; +} +.swagger-section .swagger-ui-wrap h3 { + color: black; + font-size: 1.1em; + padding: 10px 0 10px 0; +} +.swagger-section .swagger-ui-wrap .markdown ol, +.swagger-section .swagger-ui-wrap .markdown ul { + font-family: "Droid Sans", sans-serif; + margin: 5px 0 10px; + padding: 0 0 0 18px; + list-style-type: disc; +} +.swagger-section .swagger-ui-wrap form.form_box { + background-color: #ebf3f9; + border: 1px solid #c3d9ec; + padding: 10px; +} +.swagger-section .swagger-ui-wrap form.form_box label { + color: #0f6ab4 !important; +} +.swagger-section .swagger-ui-wrap form.form_box input[type=submit] { + display: block; + padding: 10px; +} +.swagger-section .swagger-ui-wrap form.form_box p.weak { + font-size: 0.8em; +} +.swagger-section .swagger-ui-wrap form.form_box p { + font-size: 0.9em; + padding: 0 0 15px; + color: #7e7b6d; +} +.swagger-section .swagger-ui-wrap form.form_box p a { + color: #646257; +} +.swagger-section .swagger-ui-wrap form.form_box p strong { + color: black; +} +.swagger-section .swagger-ui-wrap .operation-status td.markdown > p:last-child { + padding-bottom: 0; +} +.swagger-section .title { + font-style: bold; +} +.swagger-section .secondary_form { + display: none; +} +.swagger-section .main_image { + display: block; + margin-left: auto; + margin-right: auto; +} +.swagger-section .oauth_body { + margin-left: 100px; + margin-right: 100px; +} +.swagger-section .oauth_submit { + text-align: center; +} +.swagger-section .api-popup-dialog { + z-index: 10000; + position: absolute; + width: 500px; + background: #FFF; + padding: 20px; + border: 1px solid #ccc; + border-radius: 5px; + display: none; + font-size: 13px; + color: #777; +} +.swagger-section .api-popup-dialog .api-popup-title { + font-size: 24px; + padding: 10px 0; +} +.swagger-section .api-popup-dialog .api-popup-title { + font-size: 24px; + padding: 10px 0; +} +.swagger-section .api-popup-dialog p.error-msg { + padding-left: 5px; + padding-bottom: 5px; +} +.swagger-section .api-popup-dialog button.api-popup-authbtn { + height: 30px; +} +.swagger-section .api-popup-dialog button.api-popup-cancel { + height: 30px; +} +.swagger-section .api-popup-scopes { + padding: 10px 20px; +} +.swagger-section .api-popup-scopes li { + padding: 5px 0; + line-height: 20px; +} +.swagger-section .api-popup-scopes .api-scope-desc { + padding-left: 20px; + font-style: italic; +} +.swagger-section .api-popup-scopes li input { + position: relative; + top: 2px; +} +.swagger-section .api-popup-actions { + padding-top: 10px; +} +#header { + display: none; +} +.swagger-section .swagger-ui-wrap .model-signature pre { + max-height: none; +} +.swagger-section .swagger-ui-wrap .body-textarea { + width: 100px; +} +.swagger-section .swagger-ui-wrap input.parameter { + width: 100px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options { + display: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints { + display: block !important; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content { + display: block !important; +} diff --git a/datacenter/dtr/2.4/reference/api/css/reset.css b/datacenter/dtr/2.4/reference/api/css/reset.css new file mode 100644 index 0000000000..b2b078943c --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/css/reset.css @@ -0,0 +1,125 @@ +/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */ +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/datacenter/dtr/2.4/reference/api/css/screen.css b/datacenter/dtr/2.4/reference/api/css/screen.css new file mode 100644 index 0000000000..436cc28edd --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/css/screen.css @@ -0,0 +1,1279 @@ +/* Original style from softwaremaniacs.org (c) Ivan Sagalaev */ +.swagger-section pre code { + display: block; + padding: 0.5em; + background: #F0F0F0; +} +.swagger-section pre code, +.swagger-section pre .subst, +.swagger-section pre .tag .title, +.swagger-section pre .lisp .title, +.swagger-section pre .clojure .built_in, +.swagger-section pre .nginx .title { + color: black; +} +.swagger-section pre .string, +.swagger-section pre .title, +.swagger-section pre .constant, +.swagger-section pre .parent, +.swagger-section pre .tag .value, +.swagger-section pre .rules .value, +.swagger-section pre .rules .value .number, +.swagger-section pre .preprocessor, +.swagger-section pre .ruby .symbol, +.swagger-section pre .ruby .symbol .string, +.swagger-section pre .aggregate, +.swagger-section pre .template_tag, +.swagger-section pre .django .variable, +.swagger-section pre .smalltalk .class, +.swagger-section pre .addition, +.swagger-section pre .flow, +.swagger-section pre .stream, +.swagger-section pre .bash .variable, +.swagger-section pre .apache .tag, +.swagger-section pre .apache .cbracket, +.swagger-section pre .tex .command, +.swagger-section pre .tex .special, +.swagger-section pre .erlang_repl .function_or_atom, +.swagger-section pre .markdown .header { + color: #800; +} +.swagger-section pre .comment, +.swagger-section pre .annotation, +.swagger-section pre .template_comment, +.swagger-section pre .diff .header, +.swagger-section pre .chunk, +.swagger-section pre .markdown .blockquote { + color: #888; +} +.swagger-section pre .number, +.swagger-section pre .date, +.swagger-section pre .regexp, +.swagger-section pre .literal, +.swagger-section pre .smalltalk .symbol, +.swagger-section pre .smalltalk .char, +.swagger-section pre .go .constant, +.swagger-section pre .change, +.swagger-section pre .markdown .bullet, +.swagger-section pre .markdown .link_url { + color: #080; +} +.swagger-section pre .label, +.swagger-section pre .javadoc, +.swagger-section pre .ruby .string, +.swagger-section pre .decorator, +.swagger-section pre .filter .argument, +.swagger-section pre .localvars, +.swagger-section pre .array, +.swagger-section pre .attr_selector, +.swagger-section pre .important, +.swagger-section pre .pseudo, +.swagger-section pre .pi, +.swagger-section pre .doctype, +.swagger-section pre .deletion, +.swagger-section pre .envvar, +.swagger-section pre .shebang, +.swagger-section pre .apache .sqbracket, +.swagger-section pre .nginx .built_in, +.swagger-section pre .tex .formula, +.swagger-section pre .erlang_repl .reserved, +.swagger-section pre .prompt, +.swagger-section pre .markdown .link_label, +.swagger-section pre .vhdl .attribute, +.swagger-section pre .clojure .attribute, +.swagger-section pre .coffeescript .property { + color: #8888ff; +} +.swagger-section pre .keyword, +.swagger-section pre .id, +.swagger-section pre .phpdoc, +.swagger-section pre .title, +.swagger-section pre .built_in, +.swagger-section pre .aggregate, +.swagger-section pre .css .tag, +.swagger-section pre .javadoctag, +.swagger-section pre .phpdoc, +.swagger-section pre .yardoctag, +.swagger-section pre .smalltalk .class, +.swagger-section pre .winutils, +.swagger-section pre .bash .variable, +.swagger-section pre .apache .tag, +.swagger-section pre .go .typename, +.swagger-section pre .tex .command, +.swagger-section pre .markdown .strong, +.swagger-section pre .request, +.swagger-section pre .status { + font-weight: bold; +} +.swagger-section pre .markdown .emphasis { + font-style: italic; +} +.swagger-section pre .nginx .built_in { + font-weight: normal; +} +.swagger-section pre .coffeescript .javascript, +.swagger-section pre .javascript .xml, +.swagger-section pre .tex .formula, +.swagger-section pre .xml .javascript, +.swagger-section pre .xml .vbscript, +.swagger-section pre .xml .css, +.swagger-section pre .xml .cdata { + opacity: 0.5; +} +.swagger-section .swagger-ui-wrap { + line-height: 1; + font-family: "Droid Sans", sans-serif; + max-width: 960px; + margin-left: auto; + margin-right: auto; +} +.swagger-section .swagger-ui-wrap b, +.swagger-section .swagger-ui-wrap strong { + font-family: "Droid Sans", sans-serif; + font-weight: bold; +} +.swagger-section .swagger-ui-wrap q, +.swagger-section .swagger-ui-wrap blockquote { + quotes: none; +} +.swagger-section .swagger-ui-wrap p { + line-height: 1.4em; + padding: 0 0 10px; + color: #333333; +} +.swagger-section .swagger-ui-wrap q:before, +.swagger-section .swagger-ui-wrap q:after, +.swagger-section .swagger-ui-wrap blockquote:before, +.swagger-section .swagger-ui-wrap blockquote:after { + content: none; +} +.swagger-section .swagger-ui-wrap .heading_with_menu h1, +.swagger-section .swagger-ui-wrap .heading_with_menu h2, +.swagger-section .swagger-ui-wrap .heading_with_menu h3, +.swagger-section .swagger-ui-wrap .heading_with_menu h4, +.swagger-section .swagger-ui-wrap .heading_with_menu h5, +.swagger-section .swagger-ui-wrap .heading_with_menu h6 { + display: block; + clear: none; + float: left; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + width: 60%; +} +.swagger-section .swagger-ui-wrap table { + border-collapse: collapse; + border-spacing: 0; +} +.swagger-section .swagger-ui-wrap table thead tr th { + padding: 5px; + font-size: 0.9em; + color: #666666; + border-bottom: 1px solid #999999; +} +.swagger-section .swagger-ui-wrap table tbody tr:last-child td { + border-bottom: none; +} +.swagger-section .swagger-ui-wrap table tbody tr.offset { + background-color: #f0f0f0; +} +.swagger-section .swagger-ui-wrap table tbody tr td { + padding: 6px; + font-size: 0.9em; + border-bottom: 1px solid #cccccc; + vertical-align: top; + line-height: 1.3em; +} +.swagger-section .swagger-ui-wrap ol { + margin: 0px 0 10px; + padding: 0 0 0 18px; + list-style-type: decimal; +} +.swagger-section .swagger-ui-wrap ol li { + padding: 5px 0px; + font-size: 0.9em; + color: #333333; +} +.swagger-section .swagger-ui-wrap ol, +.swagger-section .swagger-ui-wrap ul { + list-style: none; +} +.swagger-section .swagger-ui-wrap h1 a, +.swagger-section .swagger-ui-wrap h2 a, +.swagger-section .swagger-ui-wrap h3 a, +.swagger-section .swagger-ui-wrap h4 a, +.swagger-section .swagger-ui-wrap h5 a, +.swagger-section .swagger-ui-wrap h6 a { + text-decoration: none; +} +.swagger-section .swagger-ui-wrap h1 a:hover, +.swagger-section .swagger-ui-wrap h2 a:hover, +.swagger-section .swagger-ui-wrap h3 a:hover, +.swagger-section .swagger-ui-wrap h4 a:hover, +.swagger-section .swagger-ui-wrap h5 a:hover, +.swagger-section .swagger-ui-wrap h6 a:hover { + text-decoration: underline; +} +.swagger-section .swagger-ui-wrap h1 span.divider, +.swagger-section .swagger-ui-wrap h2 span.divider, +.swagger-section .swagger-ui-wrap h3 span.divider, +.swagger-section .swagger-ui-wrap h4 span.divider, +.swagger-section .swagger-ui-wrap h5 span.divider, +.swagger-section .swagger-ui-wrap h6 span.divider { + color: #aaaaaa; +} +.swagger-section .swagger-ui-wrap a { + color: #547f00; +} +.swagger-section .swagger-ui-wrap a img { + border: none; +} +.swagger-section .swagger-ui-wrap article, +.swagger-section .swagger-ui-wrap aside, +.swagger-section .swagger-ui-wrap details, +.swagger-section .swagger-ui-wrap figcaption, +.swagger-section .swagger-ui-wrap figure, +.swagger-section .swagger-ui-wrap footer, +.swagger-section .swagger-ui-wrap header, +.swagger-section .swagger-ui-wrap hgroup, +.swagger-section .swagger-ui-wrap menu, +.swagger-section .swagger-ui-wrap nav, +.swagger-section .swagger-ui-wrap section, +.swagger-section .swagger-ui-wrap summary { + display: block; +} +.swagger-section .swagger-ui-wrap pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #fcf6db; + border: 1px solid #e5e0c6; + padding: 10px; +} +.swagger-section .swagger-ui-wrap pre code { + line-height: 1.6em; + background: none; +} +.swagger-section .swagger-ui-wrap .content > .content-type > div > label { + clear: both; + display: block; + color: #0F6AB4; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +.swagger-section .swagger-ui-wrap .content pre { + font-size: 12px; + margin-top: 5px; + padding: 5px; +} +.swagger-section .swagger-ui-wrap .icon-btn { + cursor: pointer; +} +.swagger-section .swagger-ui-wrap .info_title { + padding-bottom: 10px; + font-weight: bold; + font-size: 25px; +} +.swagger-section .swagger-ui-wrap .footer { + margin-top: 20px; +} +.swagger-section .swagger-ui-wrap p.big, +.swagger-section .swagger-ui-wrap div.big p { + font-size: 1em; + margin-bottom: 10px; +} +.swagger-section .swagger-ui-wrap form.fullwidth ol li.string input, +.swagger-section .swagger-ui-wrap form.fullwidth ol li.url input, +.swagger-section .swagger-ui-wrap form.fullwidth ol li.text textarea, +.swagger-section .swagger-ui-wrap form.fullwidth ol li.numeric input { + width: 500px !important; +} +.swagger-section .swagger-ui-wrap .info_license { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .info_tos { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .message-fail { + color: #cc0000; +} +.swagger-section .swagger-ui-wrap .info_url { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .info_email { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .info_name { + padding-bottom: 5px; +} +.swagger-section .swagger-ui-wrap .info_description { + padding-bottom: 10px; + font-size: 15px; +} +.swagger-section .swagger-ui-wrap .markdown ol li, +.swagger-section .swagger-ui-wrap .markdown ul li { + padding: 3px 0px; + line-height: 1.4em; + color: #333333; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input, +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input, +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input { + display: block; + padding: 4px; + width: auto; + clear: both; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input.title, +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input.title, +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input.title { + font-size: 1.3em; +} +.swagger-section .swagger-ui-wrap table.fullwidth { + width: 100%; +} +.swagger-section .swagger-ui-wrap .model-signature { + font-family: "Droid Sans", sans-serif; + font-size: 1em; + line-height: 1.5em; +} +.swagger-section .swagger-ui-wrap .model-signature .signature-nav a { + text-decoration: none; + color: #AAA; +} +.swagger-section .swagger-ui-wrap .model-signature .signature-nav a:hover { + text-decoration: underline; + color: black; +} +.swagger-section .swagger-ui-wrap .model-signature .signature-nav .selected { + color: black; + text-decoration: none; +} +.swagger-section .swagger-ui-wrap .model-signature .propType { + color: #5555aa; +} +.swagger-section .swagger-ui-wrap .model-signature pre:hover { + background-color: #ffffdd; +} +.swagger-section .swagger-ui-wrap .model-signature pre { + font-size: .85em; + line-height: 1.2em; + overflow: auto; + max-height: 200px; + cursor: pointer; +} +.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav { + display: block; + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li:last-child { + padding-right: 0; + border-right: none; +} +.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li { + float: left; + margin: 0 5px 5px 0; + padding: 2px 5px 2px 0; + border-right: 1px solid #ddd; +} +.swagger-section .swagger-ui-wrap .model-signature .propOpt { + color: #555; +} +.swagger-section .swagger-ui-wrap .model-signature .snippet small { + font-size: 0.75em; +} +.swagger-section .swagger-ui-wrap .model-signature .propOptKey { + font-style: italic; +} +.swagger-section .swagger-ui-wrap .model-signature .description .strong { + font-weight: bold; + color: #000; + font-size: .9em; +} +.swagger-section .swagger-ui-wrap .model-signature .description div { + font-size: 0.9em; + line-height: 1.5em; + margin-left: 1em; +} +.swagger-section .swagger-ui-wrap .model-signature .description .stronger { + font-weight: bold; + color: #000; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper { + border-spacing: 0; + position: absolute; + background-color: #ffffff; + border: 1px solid #bbbbbb; + display: none; + font-size: 11px; + max-width: 400px; + line-height: 30px; + color: black; + padding: 5px; + margin-left: 10px; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper th { + text-align: center; + background-color: #eeeeee; + border: 1px solid #bbbbbb; + font-size: 11px; + color: #666666; + font-weight: bold; + padding: 5px; + line-height: 15px; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper .optionName { + font-weight: bold; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown > p:first-child, +.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown > p:last-child { + display: inline; +} +.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown > p:not(:first-child):before { + display: block; + content: ''; +} +.swagger-section .swagger-ui-wrap .model-signature .description span:last-of-type.propDesc.markdown > p:only-child { + margin-right: -3px; +} +.swagger-section .swagger-ui-wrap .model-signature .propName { + font-weight: bold; +} +.swagger-section .swagger-ui-wrap .model-signature .signature-container { + clear: both; +} +.swagger-section .swagger-ui-wrap .body-textarea { + width: 300px; + height: 100px; + border: 1px solid #aaa; +} +.swagger-section .swagger-ui-wrap .markdown p code, +.swagger-section .swagger-ui-wrap .markdown li code { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #f0f0f0; + color: black; + padding: 1px 3px; +} +.swagger-section .swagger-ui-wrap .required { + font-weight: bold; +} +.swagger-section .swagger-ui-wrap input.parameter { + width: 300px; + border: 1px solid #aaa; +} +.swagger-section .swagger-ui-wrap h1 { + color: black; + font-size: 1.5em; + line-height: 1.3em; + padding: 10px 0 10px 0; + font-family: "Droid Sans", sans-serif; + font-weight: bold; +} +.swagger-section .swagger-ui-wrap .heading_with_menu { + float: none; + clear: both; + overflow: hidden; + display: block; +} +.swagger-section .swagger-ui-wrap .heading_with_menu ul { + display: block; + clear: none; + float: right; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + margin-top: 10px; +} +.swagger-section .swagger-ui-wrap h2 { + color: black; + font-size: 1.3em; + padding: 10px 0 10px 0; +} +.swagger-section .swagger-ui-wrap h2 a { + color: black; +} +.swagger-section .swagger-ui-wrap h2 span.sub { + font-size: 0.7em; + color: #999999; + font-style: italic; +} +.swagger-section .swagger-ui-wrap h2 span.sub a { + color: #777777; +} +.swagger-section .swagger-ui-wrap span.weak { + color: #666666; +} +.swagger-section .swagger-ui-wrap .message-success { + color: #89BF04; +} +.swagger-section .swagger-ui-wrap caption, +.swagger-section .swagger-ui-wrap th, +.swagger-section .swagger-ui-wrap td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} +.swagger-section .swagger-ui-wrap .code { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.text textarea { + font-family: "Droid Sans", sans-serif; + height: 250px; + padding: 4px; + display: block; + clear: both; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.select select { + display: block; + clear: both; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean { + float: none; + clear: both; + overflow: hidden; + display: block; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean label { + display: block; + float: left; + clear: none; + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean input { + display: block; + float: left; + clear: none; + margin: 0 5px 0 0; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.required label { + color: black; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label { + display: block; + clear: both; + width: auto; + padding: 0 0 3px; + color: #666666; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label abbr { + padding-left: 3px; + color: #888888; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li p.inline-hints { + margin-left: 0; + font-style: italic; + font-size: 0.9em; + margin: 0; +} +.swagger-section .swagger-ui-wrap form.formtastic fieldset.buttons { + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap span.blank, +.swagger-section .swagger-ui-wrap span.empty { + color: #888888; + font-style: italic; +} +.swagger-section .swagger-ui-wrap .markdown h3 { + color: #547f00; +} +.swagger-section .swagger-ui-wrap .markdown h4 { + color: #666666; +} +.swagger-section .swagger-ui-wrap .markdown pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #fcf6db; + border: 1px solid #e5e0c6; + padding: 10px; + margin: 0 0 10px 0; +} +.swagger-section .swagger-ui-wrap .markdown pre code { + line-height: 1.6em; +} +.swagger-section .swagger-ui-wrap div.gist { + margin: 20px 0 25px 0 !important; +} +.swagger-section .swagger-ui-wrap ul#resources { + font-family: "Droid Sans", sans-serif; + font-size: 0.9em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource { + border-bottom: 1px solid #dddddd; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading h2 a, +.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading h2 a { + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading ul.options li a, +.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading ul.options li a { + color: #555555; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource:last-child { + border-bottom: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading { + border: 1px solid transparent; + float: none; + clear: both; + overflow: hidden; + display: block; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 14px 10px 0 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; + color: #666666; + font-size: 0.9em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a { + color: #aaaaaa; + text-decoration: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover { + text-decoration: underline; + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:active, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a.active { + text-decoration: underline; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:first-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.first { + padding-left: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options:first-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options.first { + padding-left: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 { + color: #999999; + padding-left: 0; + display: block; + clear: none; + float: left; + font-family: "Droid Sans", sans-serif; + font-weight: bold; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a { + color: #999999; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover { + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0 0 10px; + padding: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 { + display: block; + clear: none; + float: left; + width: auto; + margin: 0; + padding: 0; + line-height: 1.1em; + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path { + padding-left: 10px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a { + color: black; + text-decoration: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a:hover { + text-decoration: underline; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.http_method a { + text-transform: uppercase; + text-decoration: none; + color: white; + display: inline-block; + width: 50px; + font-size: 0.7em; + text-align: center; + padding: 7px 0 4px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span { + margin: 0; + padding: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 6px 10px 0 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + font-size: 0.9em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a { + text-decoration: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li.access { + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content { + border-top: none; + padding: 10px; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + -o-border-bottom-left-radius: 6px; + -ms-border-bottom-left-radius: 6px; + -khtml-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + -o-border-bottom-right-radius: 6px; + -ms-border-bottom-right-radius: 6px; + -khtml-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + margin: 0 0 20px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content h4 { + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header { + float: none; + clear: both; + overflow: hidden; + display: block; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header a { + padding: 4px 0 0 10px; + display: inline-block; + font-size: 0.9em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header input.submit { + display: block; + clear: none; + float: left; + padding: 6px 8px; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header span.response_throbber { + background-image: url('../images/throbber.gif'); + width: 128px; + height: 16px; + display: block; + clear: none; + float: right; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form input[type='text'].error { + outline: 2px solid black; + outline-color: #cc0000; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.response div.block pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + padding: 10px; + font-size: 0.9em; + max-height: 400px; + overflow-y: auto; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading { + background-color: #f9f2e9; + border: 1px solid #f0e0ca; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a { + background-color: #c5862b; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #f0e0ca; + color: #c5862b; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a { + color: #c5862b; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content { + background-color: #faf5ee; + border: 1px solid #f0e0ca; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4 { + color: #c5862b; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header a { + color: #dcb67f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading { + background-color: #fcffcd; + border: 1px solid black; + border-color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #ffd20f; + color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a { + color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content { + background-color: #fcffcd; + border: 1px solid black; + border-color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content h4 { + color: #ffd20f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header a { + color: #6fc992; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading { + background-color: #f5e8e8; + border: 1px solid #e8c6c7; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #a41e22; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #e8c6c7; + color: #a41e22; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a { + color: #a41e22; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content { + background-color: #f7eded; + border: 1px solid #e8c6c7; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4 { + color: #a41e22; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header a { + color: #c8787a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading { + background-color: #e7f6ec; + border: 1px solid #c3e8d1; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a { + background-color: #10a54a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #c3e8d1; + color: #10a54a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a { + color: #10a54a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content { + background-color: #ebf7f0; + border: 1px solid #c3e8d1; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4 { + color: #10a54a; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header a { + color: #6fc992; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading { + background-color: #FCE9E3; + border: 1px solid #F5D5C3; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a { + background-color: #D38042; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #f0cecb; + color: #D38042; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a { + color: #D38042; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content { + background-color: #faf0ef; + border: 1px solid #f0cecb; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4 { + color: #D38042; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header a { + color: #dcb67f; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading { + background-color: #e7f0f7; + border: 1px solid #c3d9ec; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a { + background-color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #c3d9ec; + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a { + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content { + background-color: #ebf3f9; + border: 1px solid #c3d9ec; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4 { + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header a { + color: #6fa5d2; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading { + background-color: #e7f0f7; + border: 1px solid #c3d9ec; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading h3 span.http_method a { + background-color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li { + border-right: 1px solid #dddddd; + border-right-color: #c3d9ec; + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li a { + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content { + background-color: #ebf3f9; + border: 1px solid #c3d9ec; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content h4 { + color: #0f6ab4; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content div.sandbox_header a { + color: #6fa5d2; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content { + border-top: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:last-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.last, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:hover, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:active, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a.active { + text-decoration: underline; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li:first-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li.first { + padding-left: 0; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations:first-child, +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations.first { + padding-left: 0; +} +.swagger-section .swagger-ui-wrap p#colophon { + margin: 0 15px 40px 15px; + padding: 10px 0; + font-size: 0.8em; + border-top: 1px solid #dddddd; + font-family: "Droid Sans", sans-serif; + color: #999999; + font-style: italic; +} +.swagger-section .swagger-ui-wrap p#colophon a { + text-decoration: none; + color: #547f00; +} +.swagger-section .swagger-ui-wrap h3 { + color: black; + font-size: 1.1em; + padding: 10px 0 10px 0; +} +.swagger-section .swagger-ui-wrap .markdown ol, +.swagger-section .swagger-ui-wrap .markdown ul { + font-family: "Droid Sans", sans-serif; + margin: 5px 0 10px; + padding: 0 0 0 18px; + list-style-type: disc; +} +.swagger-section .swagger-ui-wrap form.form_box { + background-color: #ebf3f9; + border: 1px solid #c3d9ec; + padding: 10px; +} +.swagger-section .swagger-ui-wrap form.form_box label { + color: #0f6ab4 !important; +} +.swagger-section .swagger-ui-wrap form.form_box input[type=submit] { + display: block; + padding: 10px; +} +.swagger-section .swagger-ui-wrap form.form_box p.weak { + font-size: 0.8em; +} +.swagger-section .swagger-ui-wrap form.form_box p { + font-size: 0.9em; + padding: 0 0 15px; + color: #7e7b6d; +} +.swagger-section .swagger-ui-wrap form.form_box p a { + color: #646257; +} +.swagger-section .swagger-ui-wrap form.form_box p strong { + color: black; +} +.swagger-section .swagger-ui-wrap .operation-status td.markdown > p:last-child { + padding-bottom: 0; +} +.swagger-section .title { + font-style: bold; +} +.swagger-section .secondary_form { + display: none; +} +.swagger-section .main_image { + display: block; + margin-left: auto; + margin-right: auto; +} +.swagger-section .oauth_body { + margin-left: 100px; + margin-right: 100px; +} +.swagger-section .oauth_submit { + text-align: center; +} +.swagger-section .api-popup-dialog { + z-index: 10000; + position: absolute; + width: 500px; + background: #FFF; + padding: 20px; + border: 1px solid #ccc; + border-radius: 5px; + display: none; + font-size: 13px; + color: #777; +} +.swagger-section .api-popup-dialog .api-popup-title { + font-size: 24px; + padding: 10px 0; +} +.swagger-section .api-popup-dialog .api-popup-title { + font-size: 24px; + padding: 10px 0; +} +.swagger-section .api-popup-dialog p.error-msg { + padding-left: 5px; + padding-bottom: 5px; +} +.swagger-section .api-popup-dialog button.api-popup-authbtn { + height: 30px; +} +.swagger-section .api-popup-dialog button.api-popup-cancel { + height: 30px; +} +.swagger-section .api-popup-scopes { + padding: 10px 20px; +} +.swagger-section .api-popup-scopes li { + padding: 5px 0; + line-height: 20px; +} +.swagger-section .api-popup-scopes .api-scope-desc { + padding-left: 20px; + font-style: italic; +} +.swagger-section .api-popup-scopes li input { + position: relative; + top: 2px; +} +.swagger-section .api-popup-actions { + padding-top: 10px; +} +.swagger-section .access { + float: right; +} +.swagger-section .auth { + float: right; +} +.swagger-section .api-ic { + height: 18px; + vertical-align: middle; + display: inline-block; + background: url(../images/explorer_icons.png) no-repeat; +} +.swagger-section .api-ic .api_information_panel { + position: relative; + margin-top: 20px; + margin-left: -5px; + background: #FFF; + border: 1px solid #ccc; + border-radius: 5px; + display: none; + font-size: 13px; + max-width: 300px; + line-height: 30px; + color: black; + padding: 5px; +} +.swagger-section .api-ic .api_information_panel p .api-msg-enabled { + color: green; +} +.swagger-section .api-ic .api_information_panel p .api-msg-disabled { + color: red; +} +.swagger-section .api-ic:hover .api_information_panel { + position: absolute; + display: block; +} +.swagger-section .ic-info { + background-position: 0 0; + width: 18px; + margin-top: -6px; + margin-left: 4px; +} +.swagger-section .ic-warning { + background-position: -60px 0; + width: 18px; + margin-top: -6px; + margin-left: 4px; +} +.swagger-section .ic-error { + background-position: -30px 0; + width: 18px; + margin-top: -6px; + margin-left: 4px; +} +.swagger-section .ic-off { + background-position: -90px 0; + width: 58px; + margin-top: -4px; + cursor: pointer; +} +.swagger-section .ic-on { + background-position: -160px 0; + width: 58px; + margin-top: -4px; + cursor: pointer; +} +.swagger-section #header { + background-color: #89bf04; + padding: 14px; +} +.swagger-section #header a#logo { + font-size: 1.5em; + font-weight: bold; + text-decoration: none; + background: transparent url(../images/logo_small.png) no-repeat left center; + padding: 20px 0 20px 40px; + color: white; +} +.swagger-section #header form#api_selector { + display: block; + clear: none; + float: right; +} +.swagger-section #header form#api_selector .input { + display: block; + clear: none; + float: left; + margin: 0 10px 0 0; +} +.swagger-section #header form#api_selector .input input#input_apiKey { + width: 200px; +} +.swagger-section #header form#api_selector .input input#input_baseUrl { + width: 400px; +} +.swagger-section #header form#api_selector .input a#explore { + display: block; + text-decoration: none; + font-weight: bold; + padding: 6px 8px; + font-size: 0.9em; + color: white; + background-color: #547f00; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -o-border-radius: 4px; + -ms-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +} +.swagger-section #header form#api_selector .input a#explore:hover { + background-color: #547f00; +} +.swagger-section #header form#api_selector .input input { + font-size: 0.9em; + padding: 3px; + margin: 0; +} +.swagger-section #content_message { + margin: 10px 15px; + font-style: italic; + color: #999999; +} +.swagger-section #message-bar { + min-height: 30px; + text-align: center; + padding-top: 10px; +} diff --git a/datacenter/dtr/2.4/reference/api/css/style.css b/datacenter/dtr/2.4/reference/api/css/style.css new file mode 100644 index 0000000000..fc21a31db5 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/css/style.css @@ -0,0 +1,250 @@ +.swagger-section #header a#logo { + font-size: 1.5em; + font-weight: bold; + text-decoration: none; + background: transparent url(../images/logo.png) no-repeat left center; + padding: 20px 0 20px 40px; +} +#text-head { + font-size: 80px; + font-family: 'Roboto', sans-serif; + color: #ffffff; + float: right; + margin-right: 20%; +} +.navbar-fixed-top .navbar-nav { + height: auto; +} +.navbar-fixed-top .navbar-brand { + height: auto; +} +.navbar-header { + height: auto; +} +.navbar-inverse { + background-color: #000; + border-color: #000; +} +#navbar-brand { + margin-left: 20%; +} +.navtext { + font-size: 10px; +} +.h1, +h1 { + font-size: 60px; +} +.navbar-default .navbar-header .navbar-brand { + color: #a2dfee; +} +/* tag titles */ +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a { + color: #393939; + font-family: 'Arvo', serif; + font-size: 1.5em; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover { + color: black; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 { + color: #525252; + padding-left: 0px; + display: block; + clear: none; + float: left; + font-family: 'Arvo', serif; + font-weight: bold; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #0A0A0A; +} +.container1 { + width: 1500px; + margin: auto; + margin-top: 0; + background-image: url('../images/shield.png'); + background-repeat: no-repeat; + background-position: -40px -20px; + margin-bottom: 210px; +} +.container-inner { + width: 1200px; + margin: auto; + background-color: rgba(223, 227, 228, 0.75); + padding-bottom: 40px; + padding-top: 40px; + border-radius: 15px; +} +.header-content { + padding: 0; + width: 1000px; +} +.title1 { + font-size: 80px; + font-family: 'Vollkorn', serif; + color: #404040; + text-align: center; + padding-top: 40px; + padding-bottom: 100px; +} +#icon { + margin-top: -18px; +} +.subtext { + font-size: 25px; + font-style: italic; + color: #08b; + text-align: right; + padding-right: 250px; +} +.bg-primary { + background-color: #00468b; +} +.navbar-default .nav > li > a, +.navbar-default .nav > li > a:focus { + color: #08b; +} +.navbar-default .nav > li > a, +.navbar-default .nav > li > a:hover { + color: #08b; +} +.navbar-default .nav > li > a, +.navbar-default .nav > li > a:focus:hover { + color: #08b; +} +.text-faded { + font-size: 25px; + font-family: 'Vollkorn', serif; +} +.section-heading { + font-family: 'Vollkorn', serif; + font-size: 45px; + padding-bottom: 10px; +} +hr { + border-color: #00468b; + padding-bottom: 10px; +} +.description { + margin-top: 20px; + padding-bottom: 200px; +} +.description li { + font-family: 'Vollkorn', serif; + font-size: 25px; + color: #525252; + margin-left: 28%; + padding-top: 5px; +} +.gap { + margin-top: 200px; +} +.troubleshootingtext { + color: rgba(255, 255, 255, 0.7); + padding-left: 30%; +} +.troubleshootingtext li { + list-style-type: circle; + font-size: 25px; + padding-bottom: 5px; +} +.overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; +} +.block.response_body.json:hover { + cursor: pointer; +} +.backdrop { + color: blue; +} +#myModal { + height: 100%; +} +.modal-backdrop { + bottom: 0; + position: fixed; +} +.curl { + padding: 10px; + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + font-size: 0.9em; + max-height: 400px; + margin-top: 5px; + overflow-y: auto; + background-color: #fcf6db; + border: 1px solid #e5e0c6; + border-radius: 4px; +} +.curl_title { + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; + font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif; + font-weight: 500; + line-height: 1.1; +} +.footer { + display: none; +} +.swagger-section .swagger-ui-wrap h2 { + padding: 0; +} +h2 { + margin: 0; + margin-bottom: 5px; +} +.markdown p { + font-size: 15px; + font-family: 'Arvo', serif; +} +.swagger-section .swagger-ui-wrap .code { + font-size: 15px; + font-family: 'Arvo', serif; +} +.swagger-section .swagger-ui-wrap b { + font-family: 'Arvo', serif; +} +#signin:hover { + cursor: pointer; +} +.dropdown-menu { + padding: 15px; +} +.navbar-right .dropdown-menu { + left: 0; + right: auto; +} +#signinbutton { + width: 100%; + height: 32px; + font-size: 13px; + font-weight: bold; + color: #08b; +} +.navbar-default .nav > li .details { + color: #000000; + text-transform: none; + font-size: 15px; + font-weight: normal; + font-family: 'Open Sans', sans-serif; + font-style: italic; + line-height: 20px; + top: -2px; +} +.navbar-default .nav > li .details:hover { + color: black; +} +#signout { + width: 100%; + height: 32px; + font-size: 13px; + font-weight: bold; + color: #08b; +} diff --git a/datacenter/dtr/2.4/reference/api/css/typography.css b/datacenter/dtr/2.4/reference/api/css/typography.css new file mode 100644 index 0000000000..27c3751ac2 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/css/typography.css @@ -0,0 +1,26 @@ +/* droid-sans-regular - latin */ +@font-face { + font-family: 'Droid Sans'; + font-style: normal; + font-weight: 400; + src: url('../fonts/droid-sans-v6-latin-regular.eot'); /* IE9 Compat Modes */ + src: local('Droid Sans'), local('DroidSans'), + url('../fonts/droid-sans-v6-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/droid-sans-v6-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/droid-sans-v6-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('../fonts/droid-sans-v6-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/droid-sans-v6-latin-regular.svg#DroidSans') format('svg'); /* Legacy iOS */ +} +/* droid-sans-700 - latin */ +@font-face { + font-family: 'Droid Sans'; + font-style: normal; + font-weight: 700; + src: url('../fonts/droid-sans-v6-latin-700.eot'); /* IE9 Compat Modes */ + src: local('Droid Sans Bold'), local('DroidSans-Bold'), + url('../fonts/droid-sans-v6-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/droid-sans-v6-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/droid-sans-v6-latin-700.woff') format('woff'), /* Modern Browsers */ + url('../fonts/droid-sans-v6-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/droid-sans-v6-latin-700.svg#DroidSans') format('svg'); /* Legacy iOS */ +} diff --git a/datacenter/dtr/2.4/reference/api/custom/custom.css b/datacenter/dtr/2.4/reference/api/custom/custom.css new file mode 100644 index 0000000000..c365077de3 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/custom/custom.css @@ -0,0 +1,15 @@ +em { + font-weight: bold; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h5 { + color: #10654A; +} +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content h5 { + font-size: 1.0em; + margin: 0px; + padding: 15px 0px 5px; +} + +.swagger-section .swagger-ui-wrap table tr td:nth-child(2) textarea { + display: none !important; +} diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.eot b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.eot new file mode 100644 index 0000000000..d8524983ad Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.eot differ diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.svg b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.svg new file mode 100644 index 0000000000..a54bbbbf25 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.ttf b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.ttf new file mode 100644 index 0000000000..15896c441f Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.ttf differ diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.woff b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.woff new file mode 100644 index 0000000000..67e3e25f83 Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.woff differ diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.woff2 b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.woff2 new file mode 100644 index 0000000000..1e726a7cfc Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-700.woff2 differ diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.eot b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.eot new file mode 100644 index 0000000000..ac2698e85a Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.eot differ diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.svg b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.svg new file mode 100644 index 0000000000..d9f2a214f9 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.svg @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.ttf b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.ttf new file mode 100644 index 0000000000..fb8cea662b Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.ttf differ diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.woff b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.woff new file mode 100644 index 0000000000..abf19899f7 Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.woff differ diff --git a/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.woff2 b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.woff2 new file mode 100644 index 0000000000..9f93f74c3b Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/fonts/droid-sans-v6-latin-regular.woff2 differ diff --git a/datacenter/dtr/2.4/reference/api/images/explorer_icons.png b/datacenter/dtr/2.4/reference/api/images/explorer_icons.png new file mode 100644 index 0000000000..ed9d2fffb6 Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/images/explorer_icons.png differ diff --git a/datacenter/dtr/2.4/reference/api/images/favicon-16x16.png b/datacenter/dtr/2.4/reference/api/images/favicon-16x16.png new file mode 100755 index 0000000000..66b1a5bfb9 Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/images/favicon-16x16.png differ diff --git a/datacenter/dtr/2.4/reference/api/images/favicon-32x32.png b/datacenter/dtr/2.4/reference/api/images/favicon-32x32.png new file mode 100755 index 0000000000..32f319f89b Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/images/favicon-32x32.png differ diff --git a/datacenter/dtr/2.4/reference/api/images/favicon.ico b/datacenter/dtr/2.4/reference/api/images/favicon.ico new file mode 100755 index 0000000000..8b60bcf06a Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/images/favicon.ico differ diff --git a/datacenter/dtr/2.4/reference/api/images/logo_small.png b/datacenter/dtr/2.4/reference/api/images/logo_small.png new file mode 100644 index 0000000000..5496a65579 Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/images/logo_small.png differ diff --git a/datacenter/dtr/2.4/reference/api/images/pet_store_api.png b/datacenter/dtr/2.4/reference/api/images/pet_store_api.png new file mode 100644 index 0000000000..f9f9cd4aeb Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/images/pet_store_api.png differ diff --git a/datacenter/dtr/2.4/reference/api/images/throbber.gif b/datacenter/dtr/2.4/reference/api/images/throbber.gif new file mode 100644 index 0000000000..0639388924 Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/images/throbber.gif differ diff --git a/datacenter/dtr/2.4/reference/api/images/wordnik_api.png b/datacenter/dtr/2.4/reference/api/images/wordnik_api.png new file mode 100644 index 0000000000..dca4f1455a Binary files /dev/null and b/datacenter/dtr/2.4/reference/api/images/wordnik_api.png differ diff --git a/datacenter/dtr/2.4/reference/api/index.html b/datacenter/dtr/2.4/reference/api/index.html new file mode 100644 index 0000000000..ddd268cefb --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/index.html @@ -0,0 +1,32 @@ + + + + + Docker Trusted Registry API Documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/datacenter/dtr/2.4/reference/api/lang/en.js b/datacenter/dtr/2.4/reference/api/lang/en.js new file mode 100644 index 0000000000..776a8b72e0 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/lang/en.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Warning: Deprecated", + "Implementation Notes":"Implementation Notes", + "Response Class":"Response Class", + "Status":"Status", + "Parameters":"Parameters", + "Parameter":"Parameter", + "Value":"Value", + "Description":"Description", + "Parameter Type":"Parameter Type", + "Data Type":"Data Type", + "Response Messages":"Response Messages", + "HTTP Status Code":"HTTP Status Code", + "Reason":"Reason", + "Response Model":"Response Model", + "Request URL":"Request URL", + "Response Body":"Response Body", + "Response Code":"Response Code", + "Response Headers":"Response Headers", + "Hide Response":"Hide Response", + "Headers":"Headers", + "Try it out!":"Try it out!", + "Show/Hide":"Show/Hide", + "List Operations":"List Operations", + "Expand Operations":"Expand Operations", + "Raw":"Raw", + "can't parse JSON. Raw result":"can't parse JSON. Raw result", + "Model Schema":"Model Schema", + "Model":"Model", + "apply":"apply", + "Username":"Username", + "Password":"Password", + "Terms of service":"Terms of service", + "Created by":"Created by", + "See more at":"See more at", + "Contact the developer":"Contact the developer", + "api version":"api version", + "Response Content Type":"Response Content Type", + "fetching resource":"fetching resource", + "fetching resource list":"fetching resource list", + "Explore":"Explore", + "Show Swagger Petstore Example Apis":"Show Swagger Petstore Example Apis", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Can't read from server. It may not have the appropriate access-control-origin settings.", + "Please specify the protocol for":"Please specify the protocol for", + "Can't read swagger JSON from":"Can't read swagger JSON from", + "Finished Loading Resource Information. Rendering Swagger UI":"Finished Loading Resource Information. Rendering Swagger UI", + "Unable to read api":"Unable to read api", + "from path":"from path", + "server returned":"server returned" +}); diff --git a/datacenter/dtr/2.4/reference/api/lang/es.js b/datacenter/dtr/2.4/reference/api/lang/es.js new file mode 100644 index 0000000000..a8dff60b6a --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/lang/es.js @@ -0,0 +1,52 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Advertencia: Obsoleto", + "Implementation Notes":"Notas de implementación", + "Response Class":"Clase de la Respuesta", + "Status":"Status", + "Parameters":"Parámetros", + "Parameter":"Parámetro", + "Value":"Valor", + "Description":"Descripción", + "Parameter Type":"Tipo del Parámetro", + "Data Type":"Tipo del Dato", + "Response Messages":"Mensajes de la Respuesta", + "HTTP Status Code":"Código de Status HTTP", + "Reason":"Razón", + "Response Model":"Modelo de la Respuesta", + "Request URL":"URL de la Solicitud", + "Response Body":"Cuerpo de la Respuesta", + "Response Code":"Código de la Respuesta", + "Response Headers":"Encabezados de la Respuesta", + "Hide Response":"Ocultar Respuesta", + "Try it out!":"Pruébalo!", + "Show/Hide":"Mostrar/Ocultar", + "List Operations":"Listar Operaciones", + "Expand Operations":"Expandir Operaciones", + "Raw":"Crudo", + "can't parse JSON. Raw result":"no puede parsear el JSON. Resultado crudo", + "Model Schema":"Esquema del Modelo", + "Model":"Modelo", + "apply":"aplicar", + "Username":"Nombre de usuario", + "Password":"Contraseña", + "Terms of service":"Términos de Servicio", + "Created by":"Creado por", + "See more at":"Ver más en", + "Contact the developer":"Contactar al desarrollador", + "api version":"versión de la api", + "Response Content Type":"Tipo de Contenido (Content Type) de la Respuesta", + "fetching resource":"buscando recurso", + "fetching resource list":"buscando lista del recurso", + "Explore":"Explorar", + "Show Swagger Petstore Example Apis":"Mostrar Api Ejemplo de Swagger Petstore", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"No se puede leer del servidor. Tal vez no tiene la configuración de control de acceso de origen (access-control-origin) apropiado.", + "Please specify the protocol for":"Por favor, especificar el protocola para", + "Can't read swagger JSON from":"No se puede leer el JSON de swagger desde", + "Finished Loading Resource Information. Rendering Swagger UI":"Finalizada la carga del recurso de Información. Mostrando Swagger UI", + "Unable to read api":"No se puede leer la api", + "from path":"desde ruta", + "server returned":"el servidor retornó" +}); diff --git a/datacenter/dtr/2.4/reference/api/lang/pt.js b/datacenter/dtr/2.4/reference/api/lang/pt.js new file mode 100644 index 0000000000..f2e7c13d41 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/lang/pt.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Aviso: Depreciado", + "Implementation Notes":"Notas de Implementação", + "Response Class":"Classe de resposta", + "Status":"Status", + "Parameters":"Parâmetros", + "Parameter":"Parâmetro", + "Value":"Valor", + "Description":"Descrição", + "Parameter Type":"Tipo de parâmetro", + "Data Type":"Tipo de dados", + "Response Messages":"Mensagens de resposta", + "HTTP Status Code":"Código de status HTTP", + "Reason":"Razão", + "Response Model":"Modelo resposta", + "Request URL":"URL requisição", + "Response Body":"Corpo da resposta", + "Response Code":"Código da resposta", + "Response Headers":"Cabeçalho da resposta", + "Headers":"Cabeçalhos", + "Hide Response":"Esconder resposta", + "Try it out!":"Tente agora!", + "Show/Hide":"Mostrar/Esconder", + "List Operations":"Listar operações", + "Expand Operations":"Expandir operações", + "Raw":"Cru", + "can't parse JSON. Raw result":"Falha ao analisar JSON. Resulto cru", + "Model Schema":"Modelo esquema", + "Model":"Modelo", + "apply":"Aplicar", + "Username":"Usuário", + "Password":"Senha", + "Terms of service":"Termos do serviço", + "Created by":"Criado por", + "See more at":"Veja mais em", + "Contact the developer":"Contate o desenvolvedor", + "api version":"Versão api", + "Response Content Type":"Tipo de conteúdo da resposta", + "fetching resource":"busca recurso", + "fetching resource list":"buscando lista de recursos", + "Explore":"Explorar", + "Show Swagger Petstore Example Apis":"Show Swagger Petstore Example Apis", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Não é possível ler do servidor. Pode não ter as apropriadas configurações access-control-origin", + "Please specify the protocol for":"Por favor especifique o protocolo", + "Can't read swagger JSON from":"Não é possível ler o JSON Swagger de", + "Finished Loading Resource Information. Rendering Swagger UI":"Carregar informação de recurso finalizada. Renderizando Swagger UI", + "Unable to read api":"Não foi possível ler api", + "from path":"do caminho", + "server returned":"servidor retornou" +}); diff --git a/datacenter/dtr/2.4/reference/api/lang/ru.js b/datacenter/dtr/2.4/reference/api/lang/ru.js new file mode 100644 index 0000000000..065100f73f --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/lang/ru.js @@ -0,0 +1,52 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Ворнинг: Депрекейтед", + "Implementation Notes":"Заметки", + "Response Class":"Пример ответа", + "Status":"Статус", + "Parameters":"Параметры", + "Parameter":"Параметр", + "Value":"Значение", + "Description":"Описание", + "Parameter Type":"Тип параметра", + "Data Type":"Тип данных", + "HTTP Status Code":"HTTP код", + "Reason":"Причина", + "Response Model":"Структура ответа", + "Request URL":"URL запроса", + "Response Body":"Тело ответа", + "Response Code":"HTTP код ответа", + "Response Headers":"Заголовки ответа", + "Hide Response":"Спрятать ответ", + "Response Messages":"Что может прийти в ответ", + "Try it out!":"Попробовать!", + "Show/Hide":"Показать/Скрыть", + "List Operations":"Операции кратко", + "Expand Operations":"Операции подробно", + "Raw":"В сыром виде", + "can't parse JSON. Raw result":"Не удается распарсить ответ:", + "Model Schema":"Структура", + "Model":"Описание", + "apply":"применить", + "Username":"Имя пользователя", + "Password":"Пароль", + "Terms of service":"Условия использования", + "Created by":"Разработано", + "See more at":"Еще тут", + "Contact the developer":"Связаться с разработчиком", + "api version":"Версия API", + "Response Content Type":"Content Type ответа", + "fetching resource":"Получение ресурса", + "fetching resource list":"Получение ресурсов", + "Explore":"Поехали", + "Show Swagger Petstore Example Apis":"Показать примеры АПИ", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Не удается получить ответ от сервера. Возможно, какая-то лажа с настройками доступа", + "Please specify the protocol for":"Пожалуйста, укажите протогол для", + "Can't read swagger JSON from":"Не получается прочитать swagger json из", + "Finished Loading Resource Information. Rendering Swagger UI":"Загрузка информации о ресурсах завершена. Рендерим", + "Unable to read api":"Не удалось прочитать api", + "from path":"по адресу", + "server returned":"сервер сказал" +}); diff --git a/datacenter/dtr/2.4/reference/api/lang/tr.js b/datacenter/dtr/2.4/reference/api/lang/tr.js new file mode 100644 index 0000000000..16426a9c34 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/lang/tr.js @@ -0,0 +1,53 @@ +'use strict'; + +/* jshint quotmark: double */ +window.SwaggerTranslator.learn({ + "Warning: Deprecated":"Uyarı: Deprecated", + "Implementation Notes":"Gerçekleştirim Notları", + "Response Class":"Dönen Sınıf", + "Status":"Statü", + "Parameters":"Parametreler", + "Parameter":"Parametre", + "Value":"Değer", + "Description":"Açıklama", + "Parameter Type":"Parametre Tipi", + "Data Type":"Veri Tipi", + "Response Messages":"Dönüş Mesajı", + "HTTP Status Code":"HTTP Statü Kodu", + "Reason":"Gerekçe", + "Response Model":"Dönüş Modeli", + "Request URL":"İstek URL", + "Response Body":"Dönüş İçeriği", + "Response Code":"Dönüş Kodu", + "Response Headers":"Dönüş Üst Bilgileri", + "Hide Response":"Dönüşü Gizle", + "Headers":"Üst Bilgiler", + "Try it out!":"Dene!", + "Show/Hide":"Göster/Gizle", + "List Operations":"Operasyonları Listele", + "Expand Operations":"Operasyonları Aç", + "Raw":"Ham", + "can't parse JSON. Raw result":"JSON çözümlenemiyor. Ham sonuç", + "Model Schema":"Model Şema", + "Model":"Model", + "apply":"uygula", + "Username":"Kullanıcı Adı", + "Password":"Parola", + "Terms of service":"Servis şartları", + "Created by":"Oluşturan", + "See more at":"Daha fazlası için", + "Contact the developer":"Geliştirici ile İletişime Geçin", + "api version":"api versiyon", + "Response Content Type":"Dönüş İçerik Tipi", + "fetching resource":"kaynak getiriliyor", + "fetching resource list":"kaynak listesi getiriliyor", + "Explore":"Keşfet", + "Show Swagger Petstore Example Apis":"Swagger Petstore Örnek Api'yi Gör", + "Can't read from server. It may not have the appropriate access-control-origin settings.":"Sunucudan okuma yapılamıyor. Sunucu access-control-origin ayarlarınızı kontrol edin.", + "Please specify the protocol for":"Lütfen istenen adres için protokol belirtiniz", + "Can't read swagger JSON from":"Swagger JSON bu kaynaktan okunamıyor", + "Finished Loading Resource Information. Rendering Swagger UI":"Kaynak baglantısı tamamlandı. Swagger UI gösterime hazırlanıyor", + "Unable to read api":"api okunamadı", + "from path":"yoldan", + "server returned":"sunucuya dönüldü" +}); diff --git a/datacenter/dtr/2.4/reference/api/lang/translator.js b/datacenter/dtr/2.4/reference/api/lang/translator.js new file mode 100644 index 0000000000..591f6d4094 --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/lang/translator.js @@ -0,0 +1,39 @@ +'use strict'; + +/** + * Translator for documentation pages. + * + * To enable translation you should include one of language-files in your index.html + * after . + * For example - + * + * If you wish to translate some new texsts you should do two things: + * 1. Add a new phrase pair ("New Phrase": "New Translation") into your language file (for example lang/ru.js). It will be great if you add it in other language files too. + * 2. Mark that text it templates this way New Phrase or . + * The main thing here is attribute data-sw-translate. Only inner html, title-attribute and value-attribute are going to translate. + * + */ +window.SwaggerTranslator = { + + _words:[], + + translate: function(sel) { + var $this = this; + sel = sel || '[data-sw-translate]'; + + $(sel).each(function() { + $(this).html($this._tryTranslate($(this).html())); + + $(this).val($this._tryTranslate($(this).val())); + $(this).attr('title', $this._tryTranslate($(this).attr('title'))); + }); + }, + + _tryTranslate: function(word) { + return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word; + }, + + learn: function(wordsMap) { + this._words = wordsMap; + } +}; diff --git a/datacenter/dtr/2.4/reference/api/lib/backbone-min.js b/datacenter/dtr/2.4/reference/api/lib/backbone-min.js new file mode 100644 index 0000000000..a3f544be6d --- /dev/null +++ b/datacenter/dtr/2.4/reference/api/lib/backbone-min.js @@ -0,0 +1,15 @@ +// Backbone.js 1.1.2 + +(function(t,e){if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore");e(t,exports,i)}else{t.Backbone=e(t,{},t._,t.jQuery||t.Zepto||t.ender||t.$)}})(this,function(t,e,i,r){var s=t.Backbone;var n=[];var a=n.push;var o=n.slice;var h=n.splice;e.VERSION="1.1.2";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var u=e.Events={on:function(t,e,i){if(!c(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,r){if(!c(this,"once",t,[e,r])||!e)return this;var s=this;var n=i.once(function(){s.off(t,n);e.apply(this,arguments)});n._callback=e;return this.on(t,n,r)},off:function(t,e,r){var s,n,a,o,h,u,l,f;if(!this._events||!c(this,"off",t,[e,r]))return this;if(!t&&!e&&!r){this._events=void 0;return this}o=t?[t]:i.keys(this._events);for(h=0,u=o.length;h").attr(t);this.setElement(r,false)}else{this.setElement(i.result(this,"el"),false)}}});e.sync=function(t,r,s){var n=T[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||M()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}if(a.type==="PATCH"&&k){a.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var h=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,h,s);return h};var k=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var H=/(\(\?)?:\w+/g;var A=/\*\w+/g;var I=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,u,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);n.execute(s,a);n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)});return this},execute:function(t,e){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(I,"\\$&").replace(S,"(?:$1)?").replace(H,function(t,e){return e?t:"([^/?]+)"}).replace(A,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var R=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/#.*$/;N.started=false;i.extend(N.prototype,u,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=decodeURI(this.location.pathname+this.location.search);var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(R,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment();var s=document.documentMode;var n=P.exec(navigator.userAgent.toLowerCase())&&(!s||s<=7);this.root=("/"+this.root+"/").replace(O,"/");if(n&&this._wantsHashChange){var a=e.$('