Creating your first cluster (PGD Essential)
===========================================

This part of the Getting Started guide will help you create a local
cluster using Docker Compose. This is a great way to get familiar with
the EDB Postgres Distributed (PGD) Essential features and functionality.

Prerequisites
-------------

- Docker and Docker Compose installed on your local machine.

Install the PGD Docker Quickstart kit
-------------------------------------

To create your first PGD cluster, you can use the Docker Compose file
provided by EDB. This will set up a local cluster with three nodes,
which is perfect for testing and development purposes.

1. Make sure you have Docker and Docker Compose installed on your local
   machine. You can follow the `Docker installation guide <https://docs.docker.com/get-docker/>`_  if you haven’t done so
   already.

2. Open a terminal and on the machine where you have docker installed,
   create a new directory for your PGD cluster, for example:

.. code:: bash

     mkdir pgd-cluster
     cd pgd-cluster

3. Run the following command to download the PGD Docker Compose file:

.. code:: bash

    curl -L https://enterprisedb.com/docs/pgd/latest/get-started/assets/pgd_quickstart.sh | bash

::

   #  pgd_quickstart.sh

   # !/bin/bash

   #  This script will unpack embedded files directly into the current working directory.

   #  Designed for curl ... | bash execution.

   #  Exit immediately if a command exits with a non-zero status.

   #  Pipefail ensures that a pipelines return status is the value of the last (rightmost) command

   #  to exit with a non-zero status, or zero if all commands in the pipeline exit successfully.

   set -eo pipefail

   echo "Starting PGD Docker Quickstart unpacker (via curl | bash)..."
   echo ""
   echo "============================================================================"
   echo "WARNING: Files will be extracted directly into your current directory: $(pwd)"
   echo "         This process requires the current directory to be EMPTY."
   echo "         Affected files: Dockerfile.pge, docker-compose.yml, docker-entrypoint.sh, qs.sh" # <--- UPDATED list
   echo "============================================================================"
   echo ""

   #  --- Check if current directory is empty ---

   #  ls -A . lists all files and directories except . and ..

   if [ -n "$(ls -A .)" ]; then
       echo "Error: The current directory $(pwd) is NOT empty." >&2
       echo "       Please run this script from an empty directory to prevent accidental overwrites." >&2
       echo "       Aborting extraction." >&2
       exit 1
   fi

   echo "Current directory is empty. Proceeding with extraction."
   echo "" # Newline for readability

   #  --- No temporary directory creation or cd operations here ---

   #  Files will be extracted directly into the current working directory.

   echo "Extracting embedded files..."

   #  --- Embedded Data Decoding and Extraction ---

   #  Each files content is base64 encoded and embedded here as a here-document.

   echo "  Extracting Dockerfile.pge..."
   base64 -d <<EOF_DOCKERFILE_PGE_ > "Dockerfile.pge"
   RlJPTSBkZWJpYW4KClJVTiBhcHQtZ2V0IHVwZGF0ZSAteSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgY3VybAoKQVJHIEVEQl9TVUJTQ1JJUFRJT05fVE9LRU49IiIKClJVTiBjdXJsIC0xc0xmICJodHRwczovL2Rvd25sb2Fkcy5lbnRlcnByaXNlZGIuY29tLyR7RURCX1NVQlNDUklQVElPTl9UT0tFTn0vZW50ZXJwcmlzZS9zZXR1cC5kZWIuc2giIHwgYmFzaApSVU4gY3VybCAtMXNMZiAiaHR0cHM6Ly9kb3dubG9hZHMuZW50ZXJwcmlzZWRiLmNvbS8ke0VEQl9TVUJTQ1JJUFRJT05fVE9LRU59L3Bvc3RncmVzX2Rpc3RyaWJ1dGVkL3NldHVwLmRlYi5zaCIgfCBiYXNoCgpSVU4gYXB0LWdldCB1cGRhdGUgLXkgJiYgYXB0LWdldCBpbnN0YWxsIC15IGVkYi1wb3N0Z3Jlc2V4dGVuZGVkLTE3IGVkYi1wZ2Q2LWVzc2VudGlhbC1wZ2V4dGVuZGVkMTcgClJVTiBhcHQtZ2V0IGluc3RhbGwganEgLXkKUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBpcHV0aWxzLXBpbmcKClJVTiBta2RpciAtcCAvdmFyL2xpYi9wb3N0Z3Jlc3FsCgpDT1BZIC4vZG9ja2VyLWVudHJ5cG9pbnQuc2ggL3Zhci9saWIvcG9zdGdyZXNxbC8KClJVTiBjaG93biAtUiBwb3N0Z3Jlczpwb3N0Z3JlcyAvdmFyL2xpYi9wb3N0Z3Jlc3FsCgpSVU4gbWtkaXIgLXAgL2V0Yy9lZGIvcGdkLWNsaQoKUlVOIGNob3duIC1SIHBvc3RncmVzOnBvc3RncmVzIC9ldGMvZWRiL3BnZC1jbGkvCgoKRU5WIFBBVEg9Ii91c3IvbGliL2VkYi1wZ2UvMTcvYmluOiR7UEFUSH0iCkVOViBQR0RBVEE9Ii92YXIvbGliL2VkYi1wZ2UvMTcvZGF0YSIKClJVTiBta2RpciAtcCAvdmFyL2xpYi9lZGItcGdlLzE3L2RhdGEKUlVOIGNob3duIC1SIHBvc3RncmVzOnBvc3RncmVzIC92YXIvbGliL2VkYi1wZ2UvMTcvZGF0YQoKVk9MVU1FIC92YXIvbGliL2VkYi1wZ2UvMTcvZGF0YQoKVVNFUiBwb3N0Z3JlcwpXT1JLRElSIC92YXIvbGliL3Bvc3RncmVzcWwKCkNNRCBbIi92YXIvbGliL3Bvc3RncmVzcWwvZG9ja2VyLWVudHJ5cG9pbnQuc2giXQo=
   EOF_DOCKERFILE_PGE_
   echo "  Extracting docker-compose.yml..."
   base64 -d <<EOF_DOCKER_COMPOSE_YML_ > "docker-compose.yml"
   c2VydmljZXM6CiAgaG9zdC0xOgogICAgaW1hZ2U6IHBnZAogICAgaG9zdG5hbWU6IGhvc3QtMQogICAgZW52aXJvbm1lbnQ6CiAgICAgIFBHUEFTU1dPUkQ6IHNlY3JldAogICAgICBQR0RfSk9JTl9OT0RFX0RTTjogInBvcnQ9NTQzMiBkYm5hbWU9cGdkZGIgaG9zdD1ob3N0LTEgdXNlcj1wb3N0Z3JlcyIKICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgdm9sdW1lczoKICAgICAgLSBwZ2RhdGEtaG9zdC0xOi92YXIvbGliL2VkYi1wZ2UvMTcvZGF0YQoKICBob3N0LTI6CiAgICBpbWFnZTogcGdkCiAgICBob3N0bmFtZTogaG9zdC0yCiAgICBlbnZpcm9ubWVudDoKICAgICAgUEdQQVNTV09SRDogc2VjcmV0CiAgICAgIFBHRF9KT0lOX05PREVfRFNOOiAicG9ydD01NDMyIGRibmFtZT1wZ2RkYiBob3N0PWhvc3QtMSB1c2VyPXBvc3RncmVzIgogICAgcmVzdGFydDogYWx3YXlzCiAgICB2b2x1bWVzOgogICAgICAtIHBnZGF0YS1ob3N0LTI6L3Zhci9saWIvZWRiLXBnZS8xNy9kYXRhCgogIGhvc3QtMzoKICAgIGltYWdlOiBwZ2QKICAgIGhvc3RuYW1lOiBob3N0LTMKICAgIGVudmlyb25tZW50OgogICAgICBQR1BBU1NXT1JEOiBzZWNyZXQKICAgICAgUEdEX0pPSU5fTk9ERV9EU046ICJwb3J0PTU0MzIgZGJuYW1lPXBnZGRiIGhvc3Q9aG9zdC0xIHVzZXI9cG9zdGdyZXMiCiAgICByZXN0YXJ0OiBhbHdheXMKICAgIHBvcnRzOgogICAgICAtICI2NDMyOjY0MzIiCiAgICAgIC0gIjY0MzM6NjQzMyIKICAgICAgLSAiNjQzNDo2NDM0IgogICAgdm9sdW1lczoKICAgICAgLSBwZ2RhdGEtaG9zdC0zOi92YXIvbGliL2VkYi1wZ2UvMTcvZGF0YQoKCnZvbHVtZXM6CiAgcGdkYXRhLWhvc3QtMToKICAgIGRyaXZlcjogbG9jYWwKICAgIGRyaXZlcl9vcHRzOgogICAgICBvOiBiaW5kCiAgICAgIHR5cGU6IG5vbmUKICAgICAgZGV2aWNlOiAuL2hvc3QtMS12b2x1bWUKICBwZ2RhdGEtaG9zdC0yOgogICAgZHJpdmVyOiBsb2NhbAogICAgZHJpdmVyX29wdHM6CiAgICAgIG86IGJpbmQKICAgICAgdHlwZTogbm9uZQogICAgICBkZXZpY2U6IC4vaG9zdC0yLXZvbHVtZQogIHBnZGF0YS1ob3N0LTM6CiAgICBkcml2ZXI6IGxvY2FsCiAgICBkcml2ZXJfb3B0czoKICAgICAgbzogYmluZAogICAgICB0eXBlOiBub25lCiAgICAgIGRldmljZTogLi9ob3N0LTMtdm9sdW1lCiAgIAo=
   EOF_DOCKER_COMPOSE_YML_
   echo "  Extracting docker-entrypoint.sh..."
   base64 -d <<EOF_DOCKER_ENTRYPOINT_SH_ > "docker-entrypoint.sh"
   IyEvdXNyL2Jpbi9lbnYgYmFzaAojIFRoaXMgdmVyc2lvbiB3aWxsIGFzc3VtZSB0aGF0IGl0IGlzIFBHRQpzZXQgLWV1Cgpwd2QKClBHRF9JTklUSUFMX05PREVfQ09VTlQ9IiR7UEdEX0lOSVRJQUxfTk9ERV9DT1VOVDotM30iClBHRF9IT1NUX05BTUU9IiR7UEdEX0hPU1RfTkFNRTotJChjYXQgL2V0Yy9ob3N0bmFtZSB8IHhhcmdzKX0iClBHRF9OT0RFX05BTUU9IiR7UEdEX05PREVfTkFNRTotJChjYXQgL2V0Yy9ob3N0bmFtZSB8IHhhcmdzIHwgc2VkIHMvaG9zdC0vbm9kZS0vKX0iClBHRF9OT0RFX0dST1VQPSIke1BHRF9OT0RFX0dST1VQOi1ncm91cC0xfSIKUEdEX0NMVVNURVJfTkFNRT0iJHtQR0RfQ0xVU1RFUl9OQU1FOi1wZ2R9IgoKUE9TVEdSRVNfREI9IiR7UE9TVEdSRVNfREI6LXBnZGRifSIKUE9TVEdSRVNfVVNFUj0iJHtQT1NUR1JFU19VU0VSOi1wb3N0Z3Jlc30iClBHREFUQT0iJHtQR0RBVEE6LS92YXIvbGliL2VkYi1wZ2UvMTcvbWFpbi99IgpQR0xPR0ZJTEU9IiR7UEdMT0dGSUxFOi0vdmFyL2xpYi9lZGItcGdlLzE3L2xvZ2ZpbGV9IgoKZWNobyAiQ29uZmlndXJpbmcgJHtQR0RfTk9ERV9OQU1FfSAoJHtQR0RfSE9TVF9OQU1FfSkiCgpQR19QR0RfQ0xJX0NPTkZfQ09OVEVOVFM9JwpjbHVzdGVyOgogIG5hbWU6IHBnZAogIGVuZHBvaW50czoKICAgIC0gaG9zdD1ob3N0LTEgZGJuYW1lPXBnZGRiIHBvcnQ9NTQzMgogICAgLSBob3N0PWhvc3QtMiBkYm5hbWU9cGdkZGIgcG9ydD01NDMyCiAgICAtIGhvc3Q9aG9zdC0zIGRibmFtZT1wZ2RkYiBwb3J0PTU0MzIKJwoKIyBUaGlzIHdpbGwgYmUgdXNlZCBieSBgcGdkIG5vZGUgc2V0dXBgLgpleHBvcnQgUEdQQVNTV09SRD0iJHtQR1BBU1NXT1JEOi0kUE9TVEdSRVNfUEFTU1dPUkR9IgoKZWNobyAiJFBHX1BHRF9DTElfQ09ORl9DT05URU5UUyIgPiAvZXRjL2VkYi9wZ2QtY2xpL3BnZC1jbGktY29uZmlnLnltbAoKaWYgISBbIC1zICIkUEdEQVRBL1BHX1ZFUlNJT04iIF07IHRoZW4KICAgIGVjaG8gIlByb3Zpc2lvbmluZyBQb3N0Z3Jlcy4iCgogICAgUFJJTUFSWT0nZmFsc2UnCiAgICBjYXNlICIkUEdEX0pPSU5fTk9ERV9EU04iIGluCgkqIiBob3N0PSRQR0RfSE9TVF9OQU1FICIqIHwgImhvc3Q9JFBHRF9IT1NUX05BTUUgIiogfCAqIiBob3N0PSRQR0RfSE9TVF9OQU1FIikKCgkgICAgUFJJTUFSWT0ndHJ1ZScKCSAgICA7OwogICAgZXNhYwoKICAgIGlmIFsgJFBSSU1BUlkgPSAndHJ1ZScgXTsgdGhlbgoJZWNobyAiUHJvdmlzaW9uaW5nIFBHRCBub2RlIGFuZCBuZXcgZ3JvdXAuIgoJcGdkIG5vZGUgIiRQR0RfTk9ERV9OQU1FIiBzZXR1cCAtLXZlcmJvc2UgXAoJICAgIC0tZHNuICIkUEdEX0pPSU5fTk9ERV9EU04iIFwKCSAgICAtLWxpc3Rlbi1hZGRyICIkUEdEX0hPU1RfTkFNRSxsb2NhbGhvc3QiIFwKCSAgICAtLWluaXRpYWwtbm9kZS1jb3VudCAiJFBHRF9JTklUSUFMX05PREVfQ09VTlQiIFwKCSAgICAtLXBnZGF0YSAiJFBHREFUQSIgXAoJICAgIC0tbG9nLWZpbGUgIiRQR0xPR0ZJTEUiIFwKCSAgICAtLWNsdXN0ZXItbmFtZSAiJFBHRF9DTFVTVEVSX05BTUUiIFwKCSAgICAtLWdyb3VwLW5hbWUgIiRQR0RfTk9ERV9HUk9VUCIgCiAgICBlbHNlCgllY2hvICJQcm92aXNpb25pbmcgUEdEIG5vZGUgdG8gam9pbiBleGlzdGluZyBncm91cC4iCgoJIyBJbiBjYXNlIHdlIG5lZWQgdG8gZG8gY2xlYW51cC4KCXBzcWwgIiRQR0RfSk9JTl9OT0RFX0RTTiIgLWMgJ1NFTEVDVCBiZHIucnVuX29uX2FsbF9ub2RlcygkJCBTRUxFQ1QgYmRyLmRyb3Bfbm9kZSgnIickUEdEX05PREVfTkFNRSciJywgZm9yY2UgOj0gdHJ1ZSkgJCQpOycKCglwZ2Qgbm9kZSAiJFBHRF9OT0RFX05BTUUiIHNldHVwIC0tdmVyYm9zZSBcCgkgICAgLS1kc24gImhvc3Q9JFBHRF9IT1NUX05BTUUgcG9ydD01NDMyIGRibmFtZT0kUE9TVEdSRVNfREIgdXNlcj0kUE9TVEdSRVNfVVNFUiIgXAoJICAgIC0tbGlzdGVuLWFkZHIgIiRQR0RfSE9TVF9OQU1FLGxvY2FsaG9zdCIgXAoJICAgIC0tcGdkYXRhICIkUEdEQVRBIiBcCgkgICAgLS1sb2ctZmlsZSAiJFBHTE9HRklMRSIgXAoJICAgIC0tY2x1c3Rlci1kc24gIiRQR0RfSk9JTl9OT0RFX0RTTiIgXAoJICAgIC0tZ3JvdXAtbmFtZSAiJFBHRF9OT0RFX0dST1VQIiBcCgkgICAgLS1jbHVzdGVyLW5hbWUgIiRQR0RfQ0xVU1RFUl9OQU1FIiB8fCAocm0gLXJmICIkUEdEQVRBIiAmJiBleGl0IDEpCiAgICBmaQpmaQoKcGdfY3RsIC1EICIkUEdEQVRBIiBzdG9wIHx8IGVjaG8gIlBvc3RncmVzIG5vdCBydW5uaW5nIgoKZXhlYyBwb3N0Z3JlcyAtRCAiJFBHREFUQSIK
   EOF_DOCKER_ENTRYPOINT_SH_
   echo "  Extracting qs.sh..."
   base64 -d <<EOF_QS_SH_ > "qs.sh"
   IyEvYmluL2Jhc2gKIyBxcy5zaCAtIFBHRCBRdWlja3N0YXJ0IFV0aWxpdHkgU2NyaXB0CiMgVGhpcyBzY3JpcHQgcHJvdmlkZXMgY29tbWFuZHMgZm9yIGJ1aWxkaW5nLCBzdGFydGluZywgc3RvcHBpbmcsCiMgYW5kIGludGVyYWN0aW5nIHdpdGggdGhlIFBHRCBEb2NrZXIgZW52aXJvbm1lbnQuCgojIEV4aXQgaW1tZWRpYXRlbHkgaWYgYSBjb21tYW5kIGV4aXRzIHdpdGggYSBub24temVybyBzdGF0dXMuCnNldCAtZW8gcGlwZWZhaWwKCiMgLS0tIFV0aWxpdHkgRnVuY3Rpb25zIC0tLQoKY29tbWFuZF9leGlzdHMgKCkgewogICAgY29tbWFuZCAtdiAiJDEiID4vZGV2L251bGwgMj4mMQp9CgpjaGVja19kb2NrZXIoKSB7CiAgICBpZiAhIGNvbW1hbmRfZXhpc3RzIGRvY2tlcjsgdGhlbgogICAgICAgIGVjaG8gIkVycm9yOiBEb2NrZXIgaXMgbm90IGluc3RhbGxlZCBvciBub3QgaW4gUEFUSC4iID4mMgogICAgICAgIGVjaG8gIlBsZWFzZSBpbnN0YWxsIERvY2tlciB0byBwcm9jZWVkLiIgPiYyCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCiAgICBlY2hvICIgIERvY2tlciBmb3VuZC4iCiAgICByZXR1cm4gMAp9CgpjaGVja19kb2NrZXJfY29tcG9zZSgpIHsKICAgIGlmICEgZG9ja2VyIGNvbXBvc2UgdmVyc2lvbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBlY2hvICJFcnJvcjogRG9ja2VyIENvbXBvc2UgKHYyIG9yIG5ld2VyKSBpcyBub3QgaW5zdGFsbGVkIG9yIG5vdCBpbiBQQVRILiIgPiYyCiAgICAgICAgZWNobyAiUGxlYXNlIGluc3RhbGwgRG9ja2VyIENvbXBvc2UgdG8gcHJvY2VlZC4iID4mMgogICAgICAgIHJldHVybiAxCiAgICBmaQogICAgZWNobyAiICBEb2NrZXIgQ29tcG9zZSBmb3VuZC4iCiAgICByZXR1cm4gMAp9CgpjaGVja19zdWJzY3JpcHRpb25fdG9rZW4oKSB7CiAgICBpZiBbIC16ICIkRURCX1NVQlNDUklQVElPTl9UT0tFTiIgXTsgdGhlbgogICAgICAgIGVjaG8gIkVycm9yOiBFREJfU1VCU0NSSVBUSU9OX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuIiA+JjIKICAgICAgICBlY2hvICJQbGVhc2Ugc2V0IHRoaXMgdmFyaWFibGUgKGUuZy4sIGV4cG9ydCBFREJfU1VCU0NSSVBUSU9OX1RPS0VOPSd5b3VyX3Rva2VuJykgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvbW1hbmQuIiA+JjIKICAgICAgICByZXR1cm4gMQogICAgZmkKICAgIGVjaG8gIiAgRURCX1NVQlNDUklQVElPTl9UT0tFTiBpcyBzZXQuIgogICAgcmV0dXJuIDAKfQoKIyAtLS0gQ29tbWFuZHMgLS0tCgpjbWRfcHJlcGFyZSgpIHsKICAgIGVjaG8gIlJ1bm5pbmcgJ3ByZXBhcmUnIGNvbW1hbmQ6IENyZWF0aW5nIHZvbHVtZSBkaXJlY3Rvcmllcy4uLiIKICAgIGxvY2FsIHZvbHVtZXM9KCJob3N0LTEtdm9sdW1lIiAiaG9zdC0yLXZvbHVtZSIgImhvc3QtMy12b2x1bWUiKQogICAgbG9jYWwgc3VjY2Vzcz0wCgogICAgZm9yIHZvbCBpbiAiJHt2b2x1bWVzW0BdfSI7IGRvCiAgICAgICAgaWYgWyAhIC1kICIkdm9sIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAgQ3JlYXRpbmcgZGlyZWN0b3J5OiAnJHZvbCcuLi4iCiAgICAgICAgICAgIGlmICEgbWtkaXIgLXAgIiR2b2wiOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICJFcnJvcjogRmFpbGVkIHRvIGNyZWF0ZSAnJHZvbCcuIiA+JjIKICAgICAgICAgICAgICAgIGVjaG8gIiAgICAgICBZb3UgbWF5IG5lZWQgZWxldmF0ZWQgcGVybWlzc2lvbnMuIFRyeTogc3VkbyAuL3FzLnNoIHByZXBhcmUiID4mMgogICAgICAgICAgICAgICAgc3VjY2Vzcz0xCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIiAgU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgJyR2b2wnLiIKICAgICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIiAgRGlyZWN0b3J5ICckdm9sJyBhbHJlYWR5IGV4aXN0cy4gU2tpcHBpbmcuIgogICAgICAgIGZpCiAgICBkb25lCiAgICByZXR1cm4gJHN1Y2Nlc3MKfQoKY21kX2J1aWxkKCkgewogICAgZWNobyAiUnVubmluZyAnYnVpbGQnIGNvbW1hbmQ6IENoZWNraW5nIGVudmlyb25tZW50IGFuZCBidWlsZGluZyBQR0QgRG9ja2VyIGltYWdlLi4uIgogICAgZWNobyAiUGVyZm9ybWluZyBzeXN0ZW0gY2hlY2tzLi4uIgoKICAgIGNoZWNrX2RvY2tlciB8fCByZXR1cm4gMQogICAgY2hlY2tfZG9ja2VyX2NvbXBvc2UgfHwgcmV0dXJuIDEKICAgIGNoZWNrX3N1YnNjcmlwdGlvbl90b2tlbiB8fCByZXR1cm4gMQoKICAgIGVjaG8gIkFsbCBjaGVja3MgcGFzc2VkLiBCdWlsZGluZyBEb2NrZXIgaW1hZ2UgJ3BnZCcgZnJvbSBEb2NrZXJmaWxlLnBnZS4uLiIKCiAgICAjIFRoZSAnLicgY29udGV4dCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiAgICBkb2NrZXIgYnVpbGQgLWYgRG9ja2VyZmlsZS5wZ2UgLS1idWlsZC1hcmcgRURCX1NVQlNDUklQVElPTl9UT0tFTj0iJEVEQl9TVUJTQ1JJUFRJT05fVE9LRU4iIC10IHBnZCAuCgogICAgQlVJTERfU1RBVFVTPSQ/CiAgICBpZiBbICRCVUlMRF9TVEFUVVMgLWVxIDAgXTsgdGhlbgogICAgICAgIGVjaG8gIkRvY2tlciBpbWFnZSAncGdkJyBidWlsdCBzdWNjZXNzZnVsbHkhIgogICAgZWxzZQogICAgICAgIGVjaG8gIkVycm9yOiBEb2NrZXIgaW1hZ2UgYnVpbGQgZmFpbGVkLiBFeGl0IGNvZGU6ICRCVUlMRF9TVEFUVVMiID4mMgogICAgZmkKICAgIHJldHVybiAkQlVJTERfU1RBVFVTCn0KCmNtZF9zdGFydCgpIHsKICAgIGVjaG8gIlJ1bm5pbmcgJ3N0YXJ0JyBjb21tYW5kOiBTdGFydGluZyBEb2NrZXIgQ29tcG9zZSBzZXJ2aWNlcy4uLiIKICAgIGVjaG8gIlBlcmZvcm1pbmcgc3lzdGVtIGNoZWNrcyBmb3Igc3RhcnQuLi4iCgogICAgY2hlY2tfZG9ja2VyIHx8IHJldHVybiAxCiAgICBjaGVja19kb2NrZXJfY29tcG9zZSB8fCByZXR1cm4gMQoKICAgIGlmIFsgISAtZiAiZG9ja2VyLWNvbXBvc2UueW1sIiBdOyB0aGVuCiAgICAgICAgZWNobyAiRXJyb3I6ICdkb2NrZXItY29tcG9zZS55bWwnIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIiA+JjIKICAgICAgICBlY2hvICJQbGVhc2UgZW5zdXJlIHlvdSBhcmUgaW4gdGhlIGNvcnJlY3QgZGlyZWN0b3J5IHdoZXJlIGZpbGVzIHdlcmUgZXh0cmFjdGVkLiIgPiYyCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCgogICAgZG9ja2VyIGNvbXBvc2UgdXAgLWQKICAgIFNUQVJUX1NUQVRVUz0kPwogICAgaWYgWyAkU1RBUlRfU1RBVFVTIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvICJEb2NrZXIgQ29tcG9zZSBzZXJ2aWNlcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpbiBkZXRhY2hlZCBtb2RlLiIKICAgIGVsc2UKICAgICAgICBlY2hvICJFcnJvcjogRG9ja2VyIENvbXBvc2Ugc2VydmljZXMgZmFpbGVkIHRvIHN0YXJ0LiBFeGl0IGNvZGU6ICRTVEFSVF9TVEFUVVMiID4mMgogICAgZmkKICAgIHJldHVybiAkU1RBUlRfU1RBVFVTCn0KCmNtZF9zdG9wKCkgewogICAgZWNobyAiUnVubmluZyAnc3RvcCcgY29tbWFuZDogU3RvcHBpbmcgRG9ja2VyIENvbXBvc2Ugc2VydmljZXMuLi4iCiAgICBlY2hvICJQZXJmb3JtaW5nIHN5c3RlbSBjaGVja3MgZm9yIHN0b3AuLi4iCgogICAgY2hlY2tfZG9ja2VyIHx8IHJldHVybiAxCiAgICBjaGVja19kb2NrZXJfY29tcG9zZSB8fCByZXR1cm4gMQoKICAgIGlmIFsgISAtZiAiZG9ja2VyLWNvbXBvc2UueW1sIiBdOyB0aGVuCiAgICAgICAgZWNobyAiRXJyb3I6ICdkb2NrZXItY29tcG9zZS55bWwnIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIiA+JjIKICAgICAgICBlY2hvICJQbGVhc2UgZW5zdXJlIHlvdSBhcmUgaW4gdGhlIGNvcnJlY3QgZGlyZWN0b3J5IHdoZXJlIGZpbGVzIHdlcmUgZXh0cmFjdGVkLiIgPiYyCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCgogICAgZG9ja2VyIGNvbXBvc2UgZG93bgogICAgU1RPUF9TVEFUVVM9JD8KICAgIGlmIFsgJFNUT1BfU1RBVFVTIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvICJEb2NrZXIgQ29tcG9zZSBzZXJ2aWNlcyBzdG9wcGVkIGFuZCByZW1vdmVkIHN1Y2Nlc3NmdWxseS4iCiAgICBlbHNlCiAgICAgICAgZWNobyAiRXJyb3I6IERvY2tlciBDb21wb3NlIHNlcnZpY2VzIGZhaWxlZCB0byBzdG9wL3JlbW92ZS4gRXhpdCBjb2RlOiAkU1RPUF9TVEFUVVMiID4mMgogICAgZmkKICAgIHJldHVybiAkU1RPUF9TVEFUVVMKfQoKY21kX3BzcWwoKSB7CiAgICBlY2hvICJSdW5uaW5nICdwc3FsJyBjb21tYW5kOiBDb25uZWN0aW5nIHRvIHBnZGRiIHZpYSBob3N0LTEuLi4iCiAgICBlY2hvICJQZXJmb3JtaW5nIHN5c3RlbSBjaGVja3MgZm9yIHBzcWwuLi4iCgogICAgY2hlY2tfZG9ja2VyIHx8IHJldHVybiAxCiAgICBjaGVja19kb2NrZXJfY29tcG9zZSB8fCByZXR1cm4gMQoKICAgIGlmIFsgISAtZiAiZG9ja2VyLWNvbXBvc2UueW1sIiBdOyB0aGVuCiAgICAgICAgZWNobyAiRXJyb3I6ICdkb2NrZXItY29tcG9zZS55bWwnIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIiA+JjIKICAgICAgICBlY2hvICJQbGVhc2UgZW5zdXJlIHlvdSBhcmUgaW4gdGhlIGNvcnJlY3QgZGlyZWN0b3J5IHdoZXJlIGZpbGVzIHdlcmUgZXh0cmFjdGVkLiIgPiYyCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCgogICAgZG9ja2VyIGNvbXBvc2UgZXhlYyBob3N0LTEgcHNxbCBwZ2RkYiAiJEAiCiAgICBQU1FMX1NUQVRVUz0kPwogICAgcmV0dXJuICRQU1FMX1NUQVRVUwp9CgpjbWRfYmFzaCgpIHsKICAgIGVjaG8gIlJ1bm5pbmcgJ2Jhc2gnIGNvbW1hbmQ6IE9wZW5pbmcgYSBiYXNoIHNoZWxsIGluIGhvc3QtMSBjb250YWluZXIuLi4iCiAgICBlY2hvICJQZXJmb3JtaW5nIHN5c3RlbSBjaGVja3MgZm9yIGJhc2guLi4iCgogICAgY2hlY2tfZG9ja2VyIHx8IHJldHVybiAxCiAgICBjaGVja19kb2NrZXJfY29tcG9zZSB8fCByZXR1cm4gMQoKICAgIGlmIFsgISAtZiAiZG9ja2VyLWNvbXBvc2UueW1sIiBdOyB0aGVuCiAgICAgICAgZWNobyAiRXJyb3I6ICdkb2NrZXItY29tcG9zZS55bWwnIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIiA+JjIKICAgICAgICBlY2hvICJQbGVhc2UgZW5zdXJlIHlvdSBhcmUgaW4gdGhlIGNvcnJlY3QgZGlyZWN0b3J5IHdoZXJlIGZpbGVzIHdlcmUgZXh0cmFjdGVkLiIgPiYyCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCgogICAgZG9ja2VyIGNvbXBvc2UgZXhlYyBob3N0LTEgYmFzaCAiJEAiCiAgICBCQVNIX1NUQVRVUz0kPwogICAgcmV0dXJuICRCQVNIX1NUQVRVUwp9CgpjbWRfY2xlYW51cCgpIHsKICAgIGVjaG8gIlJ1bm5pbmcgJ2NsZWFudXAnIGNvbW1hbmQ6IFJlbW92aW5nIHZvbHVtZSBkaXJlY3Rvcmllcy4uLiIKICAgIGxvY2FsIHZvbHVtZXM9KCJob3N0LTEtdm9sdW1lIiAiaG9zdC0yLXZvbHVtZSIgImhvc3QtMy12b2x1bWUiKQogICAgbG9jYWwgc3VjY2Vzcz0wCgogICAgZm9yIHZvbCBpbiAiJHt2b2x1bWVzW0BdfSI7IGRvCiAgICAgICAgaWYgWyAtZCAiJHZvbCIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICIgIFJlbW92aW5nIGRpcmVjdG9yeTogJyR2b2wnLi4uIgogICAgICAgICAgICBpZiAhIHJtIC1yZiAiJHZvbCI7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIkVycm9yOiBGYWlsZWQgdG8gcmVtb3ZlICckdm9sJy4iID4mMgogICAgICAgICAgICAgICAgZWNobyAiICAgICAgIFlvdSBtYXkgbmVlZCBlbGV2YXRlZCBwZXJtaXNzaW9ucy4gVHJ5OiBzdWRvIC4vcXMuc2ggY2xlYW51cCIgPiYyCiAgICAgICAgICAgICAgICBzdWNjZXNzPTEKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZWNobyAiICBTdWNjZXNzZnVsbHkgcmVtb3ZlZCAnJHZvbCcuIgogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAiICBEaXJlY3RvcnkgJyR2b2wnIGRvZXMgbm90IGV4aXN0LiBTa2lwcGluZy4iCiAgICAgICAgZmkKICAgIGRvbmUKICAgIHJldHVybiAkc3VjY2Vzcwp9CgojIC0tLSBNYWluIFNjcmlwdCBMb2dpYyAtLS0KCnNob3dfaGVscCgpIHsKICAgIGVjaG8gIlVzYWdlOiBxcy5zaCA8Y29tbWFuZD4iCiAgICBlY2hvICIiCiAgICBlY2hvICJDb21tYW5kczoiCiAgICBlY2hvICIgIHByZXBhcmUgIC0gQ3JlYXRlcyAnaG9zdC1YLXZvbHVtZScgZGlyZWN0b3JpZXMgZm9yIERvY2tlciB2b2x1bWVzLiIKICAgIGVjaG8gIiAgYnVpbGQgICAgLSBDaGVja3MgZW52aXJvbm1lbnQsIGJ1aWxkcyB0aGUgJ3BnZCcgRG9ja2VyIGltYWdlLiIKICAgIGVjaG8gIiAgc3RhcnQgICAgLSBTdGFydHMgRG9ja2VyIENvbXBvc2Ugc2VydmljZXMgKGRvY2tlciBjb21wb3NlIHVwIC1kKS4iCiAgICBlY2hvICIgIHN0b3AgICAgIC0gU3RvcHMgYW5kIHJlbW92ZXMgRG9ja2VyIENvbXBvc2Ugc2VydmljZXMgKGRvY2tlciBjb21wb3NlIGRvd24pLiIKICAgIGVjaG8gIiAgcHNxbCAgICAgLSBDb25uZWN0cyB0byBwZ2RkYiBvbiBob3N0LTEgdmlhIHBzcWwgKGRvY2tlciBjb21wb3NlIGV4ZWMgaG9zdC0xIHBzcWwgcGdkZGIpLiIKICAgIGVjaG8gIiAgICAgICAgICAgICBBZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIHBzcWwuIgogICAgZWNobyAiICBiYXNoICAgICAtIE9wZW5zIGEgYmFzaCBzaGVsbCBpbiB0aGUgaG9zdC0xIGNvbnRhaW5lciAoZG9ja2VyIGNvbXBvc2UgZXhlYyBob3N0LTEgYmFzaCkuIgogICAgZWNobyAiICAgICAgICAgICAgIEFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gYmFzaC4iCiAgICBlY2hvICIgIGNsZWFudXAgIC0gUmVtb3ZlcyAnaG9zdC1YLXZvbHVtZScgZGlyZWN0b3JpZXMuIgogICAgZWNobyAiIgogICAgZWNobyAiTm90ZTogRW5zdXJlIEVEQl9TVUJTQ1JJUFRJT05fVE9LRU4gaXMgc2V0IGZvciB0aGUgJ2J1aWxkJyBjb21tYW5kLiIKfQoKIyBDaGVjayBmb3IgY29tbWFuZCBhcmd1bWVudAppZiBbIC16ICIkMSIgXTsgdGhlbgogICAgZWNobyAiRXJyb3I6IE5vIGNvbW1hbmQgcHJvdmlkZWQuIiA+JjIKICAgIHNob3dfaGVscAogICAgZXhpdCAxCmZpCgpDT01NQU5EPSIkMSIKc2hpZnQgIyBSZW1vdmUgdGhlIGNvbW1hbmQgZnJvbSBhcmd1bWVudHMsIHBhc3MgcmVtYWluaW5nIHRvIHN1YmNvbW1hbmQKCmNhc2UgIiRDT01NQU5EIiBpbgogICAgcHJlcGFyZSkKICAgICAgICBjbWRfcHJlcGFyZSAiJEAiCiAgICAgICAgOzsKICAgIGJ1aWxkKQogICAgICAgIGNtZF9idWlsZCAiJEAiCiAgICAgICAgOzsKICAgIHN0YXJ0KQogICAgICAgIGNtZF9zdGFydCAiJEAiCiAgICAgICAgOzsKICAgIHN0b3ApCiAgICAgICAgY21kX3N0b3AgIiRAIgogICAgICAgIDs7CiAgICBwc3FsKQogICAgICAgIGNtZF9wc3FsICIkQCIKICAgICAgICA7OwogICAgYmFzaCkKICAgICAgICBjbWRfYmFzaCAiJEAiCiAgICAgICAgOzsKICAgIGNsZWFudXApCiAgICAgICAgY21kX2NsZWFudXAgIiRAIgogICAgICAgIDs7CiAgICAtaHwtLWhlbHB8aGVscCkKICAgICAgICBzaG93X2hlbHAKICAgICAgICA7OwogICAgKikKICAgICAgICBlY2hvICJFcnJvcjogVW5rbm93biBjb21tYW5kICckQ09NTUFORCcuIiA+MgogICAgICAgIHNob3dfaGVscAogICAgICAgIGV4aXQgMQogICAgICAgIDs7CmVzYWMKCmV4aXQgJD8KCg==
   EOF_QS_SH_

   echo "Files unpacked successfully into the current directory: $(pwd)."
   echo ""

   #  Make necessary scripts executable

   if [ -f "qs.sh" ]; then # <--- UPDATED to qs.sh
       chmod +x qs.sh
       echo "Made qs.sh executable."
   fi

   #  Assuming docker-entrypoint.sh might also need executable permissions if present

   if [ -f "docker-entrypoint.sh" ]; then
       chmod +x docker-entrypoint.sh
       echo "Made docker-entrypoint.sh executable."
   fi

   echo ""
   echo "You can now use the qs.sh command to manage your PGD Docker environment."
   echo "For available commands, run: ./qs.sh help"
   echo ""
   echo "Common next steps:"
   echo "1. Create volume directories: ./qs.sh prepare"
   echo "2. Build the PGD Docker image: export EDB_SUBSCRIPTION_TOKEN=\"YOUR_EDB_TOKEN\"; ./qs.sh build"
   echo "3. Start the PGD services: ./qs.sh start"
   echo ""
   echo "Remember to clean up these files and created volumes manually when you are done. Example:"
   echo "  ./qs.sh stop"
   echo "  ./qs.sh cleanup"
   echo "  rm Dockerfile.pge docker-compose.yml docker-entrypoint.sh qs.sh" # <--- UPDATED list
   echo ""

   #  The script exits here after printing instructions.

   #  No automatic cleanup of extracted files as they are in the users CWD.

.. code:: yaml

   #  docker-compose.yml

   services:
     host-1:
       hostname: host-1
       image: pgd
       environment:
         PGPASSWORD: secret
         PGD_JOIN_NODE_DSN: "port=5432 dbname=pgddb host=host-1 user=postgres"
       restart: always
       volumes:
         - ./host-1-data:/var/lib/postgresql/data

     host-2:
       hostname: host-2
       extends: host-1
       volumes:
        - ./host-2-data:/var/lib/postgresql/data

     host-3:
       hostname:  host-3
       extends: host-1
       volumes:
        - ./host-3-data:/var/lib/postgresql/data

This will download the PGD Docker Quickstart kit, which includes the
Docker Compose file and other necessary files to get started with PGD
Essential.

4. Once the download is complete, you will need to prepare the
   environment for the PGD cluster. This is done by running the
   following command:

.. code:: bash

     ./qs.sh prepare

This command will create the necessary directories and files for the PGD
cluster.

5. Now you have to build the Docker images for the PGD cluster. You can
   do this by running the following command:

.. code:: bash

     export EDB_SUBSCRIPTION_TOKEN=...
     ./qs.sh build

This command will build the Docker image needed for the PGD Quickstart
cluster.

6. After the images are built, you can start the PGD cluster using
   Docker Compose. Run the following command:

.. code:: bash

     ./qs.sh start

This command will start the Docker containers and create a local cluster
with the default configuration, running in the background.

Accessing the PGD Cluster
-------------------------

1. Once the containers are up and running, you can access the PGD
   cluster using the following command:

.. code:: bash

     docker compose exec host-1 psql pgddb

This command will connect you directly to the first node of the cluster
using the ``psql`` command-line interface.

This is how you would connect to the database for maintenance and
management tasks.

For application and user access you will usually connect using the
connection manager which, by default, is running on TCP port 6432 of all
the hosts in the cluster.

1. You can connect to the write leader node in the cluster using the
   following command:

.. code:: bash

     docker compose exec host-1 psql -h host-1 -p 6432 pgddb

You can replace ``-h host-1`` with the name of any host in the cluster,
as they all run the connection manager.

If you have the psql client installed on your local machine, you can
also connect to the cluster using the following command:

.. code:: bash

     export PGPASSWORD=secret
     psql -h localhost -p 6432 -U postgres pgddb

This connects to the connection manager running on the host-3 container
on port 6432. This is then routed to the write leader node in the
cluster.

.. code:: bash

     pgddb=# select node_name from bdr.local_node_summary;
     node_name
     -----------
     node-1
     (1 row)

1. To use the PGD CLI from outside the containers, you can run the
   following command:

.. code:: bash

   docker compose exec host-1 pgd nodes list 
   __OUTPUT__
    Node Name | Group Name | Node Kind | Join State | Node Status
   - ----------+------------+-----------+------------+-------------
    node-1    | group-1    | data      | ACTIVE     | Up
    node-2    | group-1    | data      | ACTIVE     | Up
    node-3    | group-1    | data      | ACTIVE     | Up

This pgd command will lists the nodes in the cluster and their status.

You can also get a shell on the host-1 container and run the pgd command
directly:

.. code:: bash

   docker compose exec host-1 bash
   pgd nodes list
   __OUTPUT__
    Node Name | Group Name | Node Kind | Join State | Node Status
   - ----------+------------+-----------+------------+-------------
    node-1    | group-1    | data      | ACTIVE     | Up
    node-2    | group-1    | data      | ACTIVE     | Up
    node-3    | group-1    | data      | ACTIVE     | Up

This will give you access to the PGD CLI and allow you to run any PGD
commands directly on the host-1 container.

Next Steps
----------

Now that you have created your first PGD cluster, you can explore the
following topics:

- :ref:`Working with SQL and the PGD Cluster <Working with SQL and the PGD Cluster>`  to understand how to connect and interact with the
  cluster using SQL commands.

- :ref:`Loading Data into your PGD Cluster <Loading Data into your PGD Cluster>`  into the cluster using the ``COPY`` command or
  ``pg_dump`` and ``pg_restore`` .

- :ref:`Using PGD CLI <Using PGD CLI>`  to monitor and manage the cluster.
