|
1 |
| -# postgres-worksheet |
| 1 | +[](https://www.docker.com/) |
| 2 | +[](https://docs.docker.com/compose/) |
| 3 | +[](https://www.postgresql.org/) |
| 4 | +[](https://www.pgbouncer.org/) |
| 5 | +[](https://www.pgadmin.org/) |
| 6 | +<br> |
| 7 | + |
| 8 | + |
| 9 | + |
| 10 | + |
| 11 | +# Postgres worksheet |
| 12 | + |
| 13 | +This project provides a preconfigured environment for working with PostgreSQL database infrastructure using Docker Compose. |
| 14 | +It includes the following services: |
| 15 | + |
| 16 | ++ [PostgreSQL](https://www.postgresql.org/) - the primary database service with custom configuration; |
| 17 | ++ [PgBouncer](https://www.pgbouncer.org/) - a lightweight connection pooler for PostgreSQL; |
| 18 | ++ [pgAdmin](https://www.pgadmin.org/) - a web-based PostgreSQL database management tool. |
| 19 | + |
| 20 | + |
| 21 | +## Architecture |
| 22 | + |
| 23 | +### Components |
| 24 | + |
| 25 | + |
| 26 | + |
| 27 | +### Features |
| 28 | + |
| 29 | +This preconfigured project environment provides the following features: |
| 30 | + |
| 31 | ++ **PostgreSQL** |
| 32 | + + Custom configuration through a mounted `postgresql.conf` file; |
| 33 | + + Automated data model creation with scripts from mounted `docker-entrypoint-initdb.d` folder; |
| 34 | + + Persistent data model storage via volumes; |
| 35 | + + Resources optimal setup - CPU (2) and memory (4G); |
| 36 | + + Health checks to ensure the database is ready before other services start; |
| 37 | + + Isolated in the internal Docker network; |
| 38 | + |
| 39 | + |
| 40 | ++ **PgBouncer**; |
| 41 | + + Connection pooling for database to optimize resource usage; |
| 42 | + + SCRAM-SHA-256 authentication for secure connections; |
| 43 | + + Resources optimal setup - CPU (0.5) and memory (1G); |
| 44 | + + Accessible via the external Docker network; |
| 45 | + |
| 46 | + |
| 47 | ++ **pgAdmin**; |
| 48 | + + Persistent configurations storage via volumes; |
| 49 | + + Resources optimal setup - CPU (0.5) and memory (1G); |
| 50 | + |
| 51 | +### Data model |
| 52 | + |
| 53 | +In this project, an e-commerce data model is implemented by default to manage customers, products and related orders. |
| 54 | +The data model is created automatically when the database is first started and is populated with synthetic records: |
| 55 | + |
| 56 | ++ Customers - [table](config/postgresql/scripts/01-create-0001-customers-table.sql) with information about 10,000 [randomly generated](config/postgresql/scripts/02-fill-0001-customers-table.sql) customers; |
| 57 | ++ Products - [table](config/postgresql/scripts/01-create-0002-products-table.sql) with information about 100,000 [randomly generated](config/postgresql/scripts/02-fill-0002-products-table.sql) products; |
| 58 | ++ Orders - [table](config/postgresql/scripts/01-create-0003-orders-table.sql) with information about 1,000,000 [randomly generated](config/postgresql/scripts/02-fill-0003-orders-table.sql) orders; |
| 59 | + |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | +## Usage |
| 64 | + |
| 65 | +### Prerequisites |
| 66 | + |
| 67 | +Make sure you have [Docker](https://www.docker.com/) and [Docker Compose](https://docs.docker.com/compose/) installed on your machine. |
| 68 | + |
| 69 | +### Setup |
| 70 | + |
| 71 | +Project uses an `.env` file with environment variables to manage configurations and tool settings. |
| 72 | +The file should be created using the `.env.example` file provided in the root directory using the following command: |
| 73 | + |
| 74 | + |
| 75 | +```shell |
| 76 | +cp .env.example .env |
| 77 | +``` |
| 78 | + |
| 79 | +And then filled with the corresponding values: |
| 80 | + |
| 81 | +```dotenv |
| 82 | +POSTGRES_DB=<database-name> |
| 83 | +POSTGRES_USER=<postgres-user> |
| 84 | +POSTGRES_PASSWORD=<postgres-password> |
| 85 | +
|
| 86 | +PGADMIN_DEFAULT_EMAIL=<pgadmin-email> |
| 87 | +PGADMIN_DEFAULT_PASSWORD=<pgadmin-password> |
| 88 | +
|
| 89 | +POSTGRESQL_HOST=postgres |
| 90 | +POSTGRESQL_PORT=5432 |
| 91 | +``` |
| 92 | + |
| 93 | +### Run |
| 94 | + |
| 95 | +Build and start the database services infrastructure by running: |
| 96 | + |
| 97 | +```shell |
| 98 | +docker compose up -d --build |
| 99 | +``` |
| 100 | + |
| 101 | +> [!NOTE] |
| 102 | +> First run will take some time, as all necessary docker images will be loaded and the data model will be created and populated with synthetic records. |
| 103 | +
|
| 104 | +Check that all services are successfully started by running: |
| 105 | + |
| 106 | +```shell |
| 107 | +docker compose ps |
| 108 | +``` |
| 109 | + |
| 110 | +To stop all running services, execute: |
| 111 | + |
| 112 | +```shell |
| 113 | +docker compose down |
| 114 | +``` |
| 115 | + |
| 116 | +> [!NOTE] |
| 117 | +> After stopping the services, the data will not be deleted and will be available when the services are restarted. |
| 118 | +
|
| 119 | +If you want to stop the services and remove all associated data use: |
| 120 | + |
| 121 | +```shell |
| 122 | +docker compose down --volumes |
| 123 | +``` |
| 124 | + |
| 125 | +> [!WARNING] |
| 126 | +> This command deletes all service data (e.g. data model, stored passwords and configurations). |
| 127 | +
|
| 128 | + |
| 129 | +## License |
| 130 | + |
| 131 | +This project is licensed under the [MIT License](LICENSE). |
0 commit comments