├── 12 ├── analyze-service.yml ├── backup-service.yml ├── bin │ ├── analyze_start.sh │ ├── backup_start.sh │ ├── check_cluster_start.sh │ ├── clear_all_docker.sh │ ├── docker_build.sh │ ├── docker_start.sh │ ├── harbor_push.sh │ ├── hub_push.sh │ ├── postgres_start.sh │ ├── postgres_start_all.sh │ ├── postgres_start_pgb.sh │ ├── restore_start.sh │ └── show_start.sh ├── check_cluster_service.yml ├── docker-analyze │ ├── Dockerfile │ ├── analyze_log.sh │ └── pg_stat_statements_report.sql ├── docker-mamonsu │ ├── Dockerfile │ ├── agent.conf │ ├── bootstrap_post.sql │ ├── mamonsu_right_add.sql │ ├── mamonsu_start.sh │ ├── metrics.ru.md │ ├── pg_jobs_check.py │ ├── pg_partition.py │ ├── pg_probackup.py │ └── pre.sql ├── docker-pgprobackup │ ├── Dockerfile │ ├── backup.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprocheckdb │ ├── Dockerfile │ ├── check_cluster.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprorestore │ ├── Dockerfile │ ├── restore.sh │ └── show.sh ├── docker-postgres │ ├── Dockerfile │ ├── backup.sh │ ├── initdb-extension.sh │ ├── locales.conf │ ├── pg_hba.conf │ ├── pg_ident.conf │ ├── postgres │ ├── postgresql.conf │ ├── show.sh │ ├── sql │ │ ├── background_start.sql │ │ ├── db_all.sql │ │ ├── db_notpostgres.sql │ │ ├── db_postgres.sql │ │ ├── db_target.sql │ │ ├── first_db.sql │ │ ├── inf_long_running_requests.sql │ │ ├── inf_long_running_requests_13plus.sql │ │ ├── init_db_2_dblink_fdw.sql │ │ ├── init_db_3_cron.sql │ │ ├── init_db_4_fts.sql │ │ ├── post.sql │ │ ├── post_warning.sql │ │ ├── pre.sql │ │ ├── replace_char_xml.sql │ │ ├── send_email.sql │ │ ├── user_lookup.sql │ │ ├── vw_locks.sql │ │ ├── vw_partitions.sql │ │ ├── vw_who.sql │ │ ├── vw_who_13plus.sql │ │ ├── vw_who_tree.sql │ │ ├── vw_who_tree_13plus.sql │ │ └── vw_who_tree_14plus.sql │ └── update-extension.sh ├── docker_start.sh ├── postgres-service.yml ├── postgres-service_all.yml ├── postgres-service_pgb.yml ├── restore-service.yml └── show_backup-service.yml ├── 13 ├── analyze-service.yml ├── backup-service.yml ├── bin │ ├── analyze_start.sh │ ├── backup_start.sh │ ├── check_cluster_start.sh │ ├── clear_all_docker.sh │ ├── docker_build.sh │ ├── docker_start.sh │ ├── harbor_push.sh │ ├── hub_push.sh │ ├── postgres_start.sh │ ├── postgres_start_all.sh │ ├── postgres_start_pgb.sh │ ├── restore_start.sh │ └── show_start.sh ├── check_cluster_service.yml ├── docker-analyze │ ├── Dockerfile │ ├── analyze_log.sh │ └── pg_stat_statements_report.sql ├── docker-mamonsu │ ├── Dockerfile │ ├── agent.conf │ ├── bootstrap_post.sql │ ├── mamonsu_right_add.sql │ ├── mamonsu_start.sh │ ├── metrics.ru.md │ ├── pg_jobs_check.py │ ├── pg_partition.py │ ├── pg_probackup.py │ └── pre.sql ├── docker-pgprobackup │ ├── Dockerfile │ ├── backup.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprocheckdb │ ├── Dockerfile │ ├── check_cluster.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprorestore │ ├── Dockerfile │ ├── restore.sh │ └── show.sh ├── docker-postgres │ ├── Dockerfile │ ├── backup.sh │ ├── initdb-extension.sh │ ├── locales.conf │ ├── pg_hba.conf │ ├── pg_ident.conf │ ├── postgres │ ├── postgresql.conf │ ├── show.sh │ ├── sql │ │ ├── background_start.sql │ │ ├── db_all.sql │ │ ├── db_notpostgres.sql │ │ ├── db_postgres.sql │ │ ├── db_target.sql │ │ ├── first_db.sql │ │ ├── inf_long_running_requests.sql │ │ ├── inf_long_running_requests_13plus.sql │ │ ├── init_db_2_dblink_fdw.sql │ │ ├── init_db_3_cron.sql │ │ ├── init_db_4_fts.sql │ │ ├── post.sql │ │ ├── post_warning.sql │ │ ├── pre.sql │ │ ├── replace_char_xml.sql │ │ ├── send_email.sql │ │ ├── user_lookup.sql │ │ ├── vw_locks.sql │ │ ├── vw_partitions.sql │ │ ├── vw_who.sql │ │ ├── vw_who_13plus.sql │ │ ├── vw_who_tree.sql │ │ ├── vw_who_tree_13plus.sql │ │ └── vw_who_tree_14plus.sql │ └── update-extension.sh ├── docker_start.sh ├── postgres-service.yml ├── postgres-service_all.yml ├── postgres-service_pgb.yml ├── restore-service.yml └── show_backup-service.yml ├── 14 ├── analyze-service.yml ├── backup-service.yml ├── bin │ ├── analyze_start.sh │ ├── backup_start.sh │ ├── check_cluster_start.sh │ ├── clear_all_docker.sh │ ├── docker_build.sh │ ├── docker_start.sh │ ├── harbor_push.sh │ ├── hub_push.sh │ ├── postgres_start.sh │ ├── postgres_start_all.sh │ ├── postgres_start_pgb.sh │ ├── restore_start.sh │ └── show_start.sh ├── check_cluster_service.yml ├── docker-analyze │ ├── Dockerfile │ ├── analyze_log.sh │ └── pg_stat_statements_report.sql ├── docker-mamonsu │ ├── Dockerfile │ ├── agent.conf │ ├── bootstrap_post.sql │ ├── mamonsu_right_add.sql │ ├── mamonsu_start.sh │ ├── metrics.ru.md │ ├── pg_jobs_check.py │ ├── pg_partition.py │ ├── pg_probackup.py │ └── pre.sql ├── docker-pgprobackup │ ├── Dockerfile │ ├── backup.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprocheckdb │ ├── Dockerfile │ ├── check_cluster.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprorestore │ ├── Dockerfile │ ├── restore.sh │ └── show.sh ├── docker-postgres │ ├── Dockerfile │ ├── backup.sh │ ├── initdb-extension.sh │ ├── locales.conf │ ├── pg_hba.conf │ ├── pg_ident.conf │ ├── postgres │ ├── postgresql.conf │ ├── show.sh │ ├── sql │ │ ├── background_start.sql │ │ ├── db_all.sql │ │ ├── db_notpostgres.sql │ │ ├── db_postgres.sql │ │ ├── db_target.sql │ │ ├── first_db.sql │ │ ├── inf_long_running_requests.sql │ │ ├── inf_long_running_requests_13plus.sql │ │ ├── init_db_2_dblink_fdw.sql │ │ ├── init_db_3_cron.sql │ │ ├── init_db_4_fts.sql │ │ ├── post.sql │ │ ├── post_warning.sql │ │ ├── pre.sql │ │ ├── replace_char_xml.sql │ │ ├── send_email.sql │ │ ├── user_lookup.sql │ │ ├── vw_locks.sql │ │ ├── vw_partitions.sql │ │ ├── vw_who.sql │ │ ├── vw_who_13plus.sql │ │ ├── vw_who_tree.sql │ │ ├── vw_who_tree_13plus.sql │ │ └── vw_who_tree_14plus.sql │ └── update-extension.sh ├── docker_start.sh ├── postgres-service.yml ├── postgres-service_all.yml ├── postgres-service_pgb.yml ├── restore-service.yml └── show_backup-service.yml ├── 15 ├── analyze-service.yml ├── backup-service.yml ├── bin │ ├── analyze_start.sh │ ├── backup_start.sh │ ├── check_cluster_start.sh │ ├── clear_all_docker.sh │ ├── docker_build.sh │ ├── docker_start.sh │ ├── harbor_push.sh │ ├── hub_push.sh │ ├── postgres_start.sh │ ├── postgres_start_all.sh │ ├── postgres_start_pgb.sh │ ├── restore_start.sh │ ├── show_start.sh │ └── upgrade_start.sh ├── check_cluster_service.yml ├── docker-analyze │ ├── Dockerfile │ ├── analyze_log.sh │ └── pg_stat_statements_report.sql ├── docker-mamonsu │ ├── Dockerfile │ ├── agent.conf │ ├── bootstrap_post.sql │ ├── mamonsu_right_add.sql │ ├── mamonsu_start.sh │ ├── metrics.ru.md │ ├── pg_jobs_check.py │ ├── pg_partition.py │ ├── pg_probackup.py │ └── pre.sql ├── docker-pgprobackup │ ├── Dockerfile │ ├── backup.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprocheckdb │ ├── Dockerfile │ ├── check_cluster.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprorestore │ ├── Dockerfile │ ├── restore.sh │ └── show.sh ├── docker-pgupgrade │ ├── Dockerfile │ ├── pg_hba.conf │ ├── pg_ident.conf │ ├── postgresql.conf │ └── upgrade.sh ├── docker-postgres │ ├── Dockerfile │ ├── backup.sh │ ├── initdb-extension.sh │ ├── locales.conf │ ├── pg_hba.conf │ ├── pg_ident.conf │ ├── postgres │ ├── postgresql.conf │ ├── show.sh │ ├── sql │ │ ├── background_start.sql │ │ ├── db_all.sql │ │ ├── db_notpostgres.sql │ │ ├── db_postgres.sql │ │ ├── db_target.sql │ │ ├── first_db.sql │ │ ├── inf_long_running_requests.sql │ │ ├── inf_long_running_requests_13plus.sql │ │ ├── init_db_2_dblink_fdw.sql │ │ ├── init_db_3_cron.sql │ │ ├── init_db_4_fts.sql │ │ ├── post.sql │ │ ├── post_warning.sql │ │ ├── pre.sql │ │ ├── replace_char_xml.sql │ │ ├── send_email.sql │ │ ├── user_lookup.sql │ │ ├── vw_locks.sql │ │ ├── vw_partitions.sql │ │ ├── vw_who.sql │ │ ├── vw_who_13plus.sql │ │ ├── vw_who_tree.sql │ │ ├── vw_who_tree_13plus.sql │ │ └── vw_who_tree_14plus.sql │ └── update-extension.sh ├── docker_start.sh ├── postgres-pgupgrade.yml ├── postgres-service.yml ├── postgres-service_all.yml ├── postgres-service_pgb.yml ├── restore-service.yml ├── show_backup-service.yml └── upgrade_start.sh ├── 16 ├── analyze-service.yml ├── backup-service.yml ├── bin │ ├── analyze_start.sh │ ├── backup_start.sh │ ├── check_cluster_start.sh │ ├── clear_all_docker.sh │ ├── docker_build.sh │ ├── docker_start.sh │ ├── harbor_push.sh │ ├── hub_push.sh │ ├── postgres_start.sh │ ├── postgres_start_all.sh │ ├── postgres_start_pgb.sh │ ├── restore_start.sh │ ├── show_start.sh │ └── upgrade_start.sh ├── check_cluster_service.yml ├── docker-analyze │ ├── Dockerfile │ ├── analyze_log.sh │ └── pg_stat_statements_report.sql ├── docker-mamonsu │ ├── Dockerfile │ ├── agent.conf │ ├── bootstrap_post.sql │ ├── mamonsu_right_add.sql │ ├── mamonsu_start.sh │ ├── metrics.ru.md │ ├── pg_jobs_check.py │ ├── pg_partition.py │ ├── pg_probackup.py │ └── pre.sql ├── docker-pgprobackup │ ├── Dockerfile │ ├── backup.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprocheckdb │ ├── Dockerfile │ ├── check_cluster.sh │ ├── show.sh │ └── sql │ │ └── first_db.sql ├── docker-pgprorestore │ ├── Dockerfile │ ├── restore.sh │ └── show.sh ├── docker-pgupgrade │ ├── Dockerfile │ ├── pg_hba.conf │ ├── pg_ident.conf │ ├── postgresql.conf │ └── upgrade.sh ├── docker-postgres │ ├── Dockerfile │ ├── backup.sh │ ├── initdb-extension.sh │ ├── locales.conf │ ├── pg_hba.conf │ ├── pg_ident.conf │ ├── postgres │ ├── postgresql.conf │ ├── show.sh │ ├── sql │ │ ├── background_start.sql │ │ ├── db_all.sql │ │ ├── db_notpostgres.sql │ │ ├── db_postgres.sql │ │ ├── db_target.sql │ │ ├── first_db.sql │ │ ├── inf_long_running_requests.sql │ │ ├── inf_long_running_requests_13plus.sql │ │ ├── init_db_2_dblink_fdw.sql │ │ ├── init_db_3_cron.sql │ │ ├── init_db_4_fts.sql │ │ ├── post.sql │ │ ├── post_warning.sql │ │ ├── pre.sql │ │ ├── replace_char_xml.sql │ │ ├── send_email.sql │ │ ├── user_lookup.sql │ │ ├── vw_locks.sql │ │ ├── vw_partitions.sql │ │ ├── vw_who.sql │ │ ├── vw_who_13plus.sql │ │ ├── vw_who_tree.sql │ │ ├── vw_who_tree_13plus.sql │ │ └── vw_who_tree_14plus.sql │ └── update-extension.sh ├── docker_start.sh ├── postgres-pgupgrade.yml ├── postgres-service.yml ├── postgres-service_all.yml ├── postgres-service_pgb.yml ├── restore-service.yml ├── show_backup-service.yml └── upgrade_start.sh ├── .project ├── LICENSE └── README.md /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | docker-postgres 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /12/analyze-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | analyze: 5 | build: 6 | context: ./docker-analyze 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/log/pgbouncer1:/var/log/pgbouncer" 12 | - "/var/log/mamonsu1:/var/log/mamonsu" 13 | 14 | environment: 15 | STAT_STATEMENTS: "true" 16 | # TZ: "Etc/UTC" 17 | TZ: "Europe/Moscow" 18 | PGPASSWORD: qweasdzxc 19 | # PGHOST: 10.10.2.139 20 | PGHOST: postgres 21 | PGPORT: 5432 22 | PGBHOST: pgbouncer 23 | PGBPORT: 6432 24 | -------------------------------------------------------------------------------- /12/backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/12_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | PGHOST: postgres 16 | PGPORT: 5432 17 | # PGUSER: "postgres" 18 | # PGPASSWORD: "qweasdzxc" 19 | EMAILTO: "DBA-PostgreSQL@company.ru" 20 | EMAIL_SERVER: "mail.company.ru" 21 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 22 | BACKUP_THREADS: "4" 23 | BACKUP_MODE: "" 24 | BACKUP_STREAM: "yes" 25 | -------------------------------------------------------------------------------- /12/bin/analyze_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "analyze-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /12/bin/backup_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /12/bin/check_cluster_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "check_cluster_service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /12/bin/clear_all_docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # docker system prune -a # чистка всех образов в каталоге /var/lib/docker/overlay2 3 | docker stop $(docker ps -q) 4 | docker rm -v $(docker ps -aq -f status=exited) 5 | docker rmi $(docker image ls -q) -f 6 | docker rmi $(docker image ls -q) -f 7 | -------------------------------------------------------------------------------- /12/bin/docker_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # получает через пробел имена контейнеров для сборки. Если не указано, то принимается такая строка: 4 | # pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore 5 | # 6 | VERSION=12 7 | 8 | set -euo pipefail 9 | 10 | if [[ $# -ne 0 ]]; then 11 | LISTDOCKER=$@ 12 | else 13 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 14 | fi 15 | 16 | for param in $LISTDOCKER 17 | do 18 | cd docker-$param 19 | dir=`pwd` 20 | echo "" 21 | echo "=====================================" 22 | echo " $dir" 23 | echo "=====================================" 24 | echo "" 25 | docker build --no-cache . -t ${VERSION}_$param:latest 26 | cd .. 27 | done 28 | 29 | docker image ls --all 30 | -------------------------------------------------------------------------------- /12/bin/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker run -p 127.0.0.1:5433:5432/tcp --shm-size 2147483648 \ 3 | -e POSTGRES_PASSWORD=postgres \ 4 | -e POSTGRES_HOST_AUTH_METHOD=trust \ 5 | -e DEPLOY_PASSWORD=postgres \ 6 | -e TZ="Etc/UTC" \ 7 | grufos/postgres:12.18 \ 8 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" \ 9 | -c shared_ispell.max_size=70MB 10 | -------------------------------------------------------------------------------- /12/bin/harbor_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=12 3 | MINOR=18 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | PROJECT=dba_postgres 8 | URL=harbor.company.ru 9 | ACCOUNT="${URL}/${PROJECT}" 10 | LATEST_PUSH='no' 11 | 12 | set -euo pipefail 13 | 14 | if [[ $# -ne 0 ]]; then 15 | LISTDOCKER=$@ 16 | else 17 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 18 | fi 19 | 20 | for param in $LISTDOCKER 21 | do 22 | if [ "$param" = "pgbouncer" ]; then 23 | vers="${VERS_BOUNCER}" 24 | elif [ "$param" = "mamonsu" ]; then 25 | vers="${VERSION}_${VERS_MAMONSU}" 26 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 27 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 28 | else 29 | vers="${VERSION}.${MINOR}" 30 | fi 31 | echo "=======================" 32 | echo "${param} -> ${vers}" 33 | echo "=======================" 34 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 35 | echo " push ..." 36 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 37 | if [ "$LATEST_PUSH" = "yes" ]; then 38 | docker push ${ACCOUNT}/${param}:latest 39 | fi 40 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 41 | docker push ${ACCOUNT}/${param}:${vers} 42 | fi 43 | done 44 | -------------------------------------------------------------------------------- /12/bin/hub_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=12 3 | MINOR=18 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | ACCOUNT=grufos 8 | LATEST_PUSH='no' 9 | 10 | set -euo pipefail 11 | 12 | if [[ $# -ne 0 ]]; then 13 | LISTDOCKER=$@ 14 | else 15 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 16 | fi 17 | 18 | for param in $LISTDOCKER 19 | do 20 | if [ "$param" = "pgbouncer" ]; then 21 | vers="${VERS_BOUNCER}" 22 | elif [ "$param" = "mamonsu" ]; then 23 | vers="${VERSION}_${VERS_MAMONSU}" 24 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 25 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 26 | else 27 | vers="${VERSION}.${MINOR}" 28 | fi 29 | echo "=======================" 30 | echo "${param} -> ${vers}" 31 | echo "=======================" 32 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 33 | echo " push ..." 34 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 35 | if [ "$LATEST_PUSH" = "yes" ]; then 36 | docker push ${ACCOUNT}/${param}:latest 37 | fi 38 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 39 | docker push ${ACCOUNT}/${param}:${vers} 40 | fi 41 | done 42 | -------------------------------------------------------------------------------- /12/bin/postgres_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/postgresql1/* 8 | docker-compose -f "postgres-service.yml" up --build "$@" 9 | -------------------------------------------------------------------------------- /12/bin/postgres_start_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_all.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /12/bin/postgres_start_pgb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_pgb.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /12/bin/restore_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "restore-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /12/bin/show_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "show_backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /12/check_cluster_service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprocheckdb: 5 | build: 6 | context: ./docker-pgprocheckdb 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/lib/pgsql/12_1/data:/var/lib/postgresql/data" 12 | - "/mnt/pgbak2/:/mnt/pgbak/" 13 | 14 | environment: 15 | TZ: "Europe/Moscow" 16 | EMAILTO: "DBA-PostgreSQL@company.ru" 17 | EMAIL_SERVER: "mail.company.ru" 18 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 19 | EMAIL_SEND: "no" 20 | PGHOST: "postgres" 21 | PGPORT: "5432" 22 | PGUSER: "postgres" 23 | PGPASSWORD: "qweasdzxc" 24 | BACKUP_THREADS: "4" 25 | AMCHECK: "true" 26 | HEAPALLINDEXED: "true" 27 | 28 | -------------------------------------------------------------------------------- /12/docker-analyze/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 12 10 | ENV BACKUP_PATH /mnt/pgbak 11 | 12 | # explicitly set user/group IDs 13 | RUN set -eux; \ 14 | groupadd -r postgres --gid=999; \ 15 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 16 | mkdir -p /var/lib/postgresql/data; 17 | 18 | RUN apt-get update \ 19 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail bzip2 pgbadger \ 20 | # ... install psql ... 21 | && echo "deb http://apt.postgresql.org/pub/repos/apt $DEBIAN_RELEASE-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 22 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 23 | && apt-get update \ 24 | && apt-get install -y --no-install-recommends postgresql-client-$PG_MAJOR \ 25 | # ... create dirs ... 26 | && mkdir -p /var/log/postgresql/report \ 27 | && mkdir -p /var/log/pgbouncer \ 28 | && mkdir -p /var/log/mamonsu \ 29 | # ... cleaning ... 30 | && apt-get -f install \ 31 | && apt-get -y autoremove \ 32 | && apt-get -y clean \ 33 | && apt-get -y autoclean \ 34 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 35 | 36 | COPY ./analyze_log.sh /usr/local/bin 37 | COPY ./pg_stat_statements_report.sql /var/lib/postgresql 38 | 39 | RUN chown postgres:postgres /var/lib/postgresql/*.sql \ 40 | && chown -R postgres:postgres /var/log/postgresql/report \ 41 | && chown -R postgres:postgres /var/log/pgbouncer \ 42 | && chown -R postgres:postgres /var/log/mamonsu \ 43 | && chmod +x /usr/local/bin/*.sh 44 | 45 | USER postgres 46 | ENTRYPOINT [ "/usr/local/bin/analyze_log.sh" ] 47 | -------------------------------------------------------------------------------- /12/docker-mamonsu/bootstrap_post.sql: -------------------------------------------------------------------------------- 1 | select 'GRANT EXECUTE ON FUNCTION mamonsu.' || oid::regprocedure || ' TO mamonsu;' from pg_proc where pronamespace = 'mamonsu'::regnamespace \gexec 2 | -------------------------------------------------------------------------------- /12/docker-mamonsu/mamonsu_right_add.sql: -------------------------------------------------------------------------------- 1 | select not pg_is_in_recovery() as is_master \gset 2 | \if :is_master 3 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 4 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 5 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 6 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 7 | select current_database() = 'mamonsu' as is_mamonsu_db \gset 8 | \if :is_mamonsu_db 9 | select '''' || case when current_setting('shared_buffers') like '%GB' 10 | then (replace(current_setting('shared_buffers'), 'GB', '')::int)*1024 11 | else replace(current_setting('shared_buffers'), 'MB', '')::int 12 | end * 0.0117 || ' MB''' as highpage_mb \gset 13 | ALTER FUNCTION mamonsu.buffer_cache() SET WORK_MEM = :highpage_mb; -- for shared_buffers 16 Гб 200 Мб 14 | GRANT USAGE ON SCHEMA public TO mamonsu; 15 | GRANT EXECUTE ON FUNCTION public.pg_stat_statements(boolean) TO mamonsu; 16 | \endif 17 | -- we give the right to connect for the role of mamonsu 18 | do $$ begin execute 'GRANT CONNECT ON DATABASE "' || current_database() || '" TO mamonsu; '; end $$; 19 | -- 20 | CREATE SCHEMA IF NOT EXISTS pgbouncer; 21 | GRANT CONNECT ON DATABASE mamonsu TO pgbouncer; 22 | GRANT USAGE ON SCHEMA pgbouncer TO pgbouncer; 23 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 24 | LANGUAGE plpgsql SECURITY DEFINER 25 | AS $$ 26 | BEGIN 27 | SELECT usename, passwd FROM pg_catalog.pg_shadow 28 | WHERE usename = p_username INTO uname, phash; 29 | RETURN; 30 | END; 31 | $$; 32 | \endif 33 | -------------------------------------------------------------------------------- /12/docker-mamonsu/pre.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not pg_is_in_recovery() as is_master \gset 6 | \if :is_master 7 | select not exists(select true FROM pg_catalog.pg_database where datname='mamonsu') as is_db_mamonsu \gset 8 | \if :is_db_mamonsu 9 | CREATE DATABASE mamonsu; 10 | \endif 11 | \c mamonsu 12 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 13 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 14 | -- check role mamonsu ... 15 | select not exists(select * from pg_roles where rolname = 'mamonsu') as is_role_mamonsu \gset 16 | \if :is_role_mamonsu 17 | select :'MAMONSU_PASSWORD' = '' as is_mamonsu_password_exists \gset 18 | \if :is_mamonsu_password_exists 19 | CREATE ROLE mamonsu LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 20 | \else 21 | CREATE ROLE mamonsu LOGIN PASSWORD :'MAMONSU_PASSWORD' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 22 | \endif 23 | \else 24 | select :'MAMONSU_PASSWORD' <> '' as is_mamonsu_password_notexists \gset 25 | \if :is_mamonsu_password_notexists 26 | ALTER ROLE mamonsu WITH PASSWORD :'MAMONSU_PASSWORD' ; 27 | \endif 28 | \endif 29 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 30 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 31 | \endif 32 | 33 | -- get list all current DBs 34 | select string_agg(datname,' ') from pg_catalog.pg_database where not datistemplate; 35 | -------------------------------------------------------------------------------- /12/docker-pgprobackup/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /12/docker-pgprobackup/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /12/docker-pgprocheckdb/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /12/docker-pgprocheckdb/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /12/docker-pgprorestore/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 12 10 | ENV PGDATA /var/lib/postgresql/data 11 | ENV BACKUP_PATH /mnt/pgbak 12 | 13 | # explicitly set user/group IDs 14 | RUN set -eux; \ 15 | groupadd -r postgres --gid=999; \ 16 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 17 | mkdir -p /var/lib/postgresql/data; \ 18 | chown -R postgres:postgres /var/lib/postgresql 19 | 20 | RUN apt-get update \ 21 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail jq \ 22 | # подключаем репозитарий сообщества PostgreSQL 23 | && echo "deb http://apt.postgresql.org/pub/repos/apt ${DEBIAN_RELEASE}-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 24 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 25 | # подключаем репозитарий архивной утилиты 26 | && echo "deb [arch=amd64] https://repo.postgrespro.ru/pg_probackup/deb/ $DEBIAN_RELEASE main-$DEBIAN_RELEASE" > /etc/apt/sources.list.d/pg_probackup.list \ 27 | && wget -qO - https://repo.postgrespro.ru/pg_probackup/keys/GPG-KEY-PG-PROBACKUP | tee /etc/apt/trusted.gpg.d/pg_probackup.asc \ 28 | # ... updating ... 29 | && apt-get update \ 30 | && apt-get install -y --no-install-recommends \ 31 | pg-probackup-$PG_MAJOR \ 32 | && mkdir -p $BACKUP_PATH \ 33 | && chown -R postgres:postgres $BACKUP_PATH \ 34 | # ... cleaning ... 35 | && apt-get -f install \ 36 | && apt-get -y autoremove \ 37 | && apt-get -y clean \ 38 | && apt-get -y autoclean \ 39 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 40 | 41 | COPY ./restore.sh /usr/local/bin 42 | COPY ./show.sh /usr/local/bin 43 | 44 | RUN chmod +x /usr/local/bin/*.sh 45 | 46 | ENTRYPOINT [ "/usr/local/bin/restore.sh" ] 47 | -------------------------------------------------------------------------------- /12/docker-pgprorestore/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$1" != "" ]; then 24 | EMAIL_SEND=$1 25 | fi 26 | 27 | if [ "$2" != "" ]; then 28 | EMAILTO="$2" 29 | fi 30 | 31 | if [ "$BACKUP_PATH" = "" ]; then 32 | BACKUP_PATH="/mnt/pgbak" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /12/docker-postgres/locales.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | date format = %Y-%m-%d %H:%M:%S.%z 3 | 4 | [en_US] 5 | date format = %Y-%m-%d %H:%M:%S.%z 6 | language = us_english 7 | charset = iso_1 8 | -------------------------------------------------------------------------------- /12/docker-postgres/pg_ident.conf: -------------------------------------------------------------------------------- 1 | # PostgreSQL User Name Maps 2 | # ========================= 3 | # 4 | # Refer to the PostgreSQL documentation, chapter "Client 5 | # Authentication" for a complete description. A short synopsis 6 | # follows. 7 | # 8 | # This file controls PostgreSQL user name mapping. It maps external 9 | # user names to their corresponding PostgreSQL user names. Records 10 | # are of the form: 11 | # 12 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 13 | # 14 | # (The uppercase quantities must be replaced by actual values.) 15 | # 16 | # MAPNAME is the (otherwise freely chosen) map name that was used in 17 | # pg_hba.conf. SYSTEM-USERNAME is the detected user name of the 18 | # client. PG-USERNAME is the requested PostgreSQL user name. The 19 | # existence of a record specifies that SYSTEM-USERNAME may connect as 20 | # PG-USERNAME. 21 | # 22 | # If SYSTEM-USERNAME starts with a slash (/), it will be treated as a 23 | # regular expression. Optionally this can contain a capture (a 24 | # parenthesized subexpression). The substring matching the capture 25 | # will be substituted for \1 (backslash-one) if present in 26 | # PG-USERNAME. 27 | # 28 | # Multiple maps may be specified in this file and used by pg_hba.conf. 29 | # 30 | # No map names are defined in the default configuration. If all 31 | # system user names and PostgreSQL user names are the same, you don't 32 | # need anything in this file. 33 | # 34 | # This file is read on server startup and when the postmaster receives 35 | # a SIGHUP signal. If you edit the file on a running system, you have 36 | # to SIGHUP the postmaster for the changes to take effect. You can 37 | # use "pg_ctl reload" to do that. 38 | 39 | # Put your actual configuration here 40 | # ---------------------------------- 41 | 42 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 43 | main postgres backup -------------------------------------------------------------------------------- /12/docker-postgres/postgres: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # this is start file for postgres 4 | 5 | # Check on the need to initialize the catalog of the FTS 6 | tar -xzkf /usr/share/postgresql/$PG_MAJOR/tsearch_data.tar.gz -C /usr/share/postgresql/tsearch_data/ > /dev/null 2>&1 7 | 8 | # start postgres process ... 9 | exec /usr/lib/postgresql/$PG_MAJOR/bin/postgres ${@} 10 | -------------------------------------------------------------------------------- /12/docker-postgres/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /12/docker-postgres/sql/background_start.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.background_start(p_command text) RETURNS void 2 | LANGUAGE plpgsql 3 | AS $$ 4 | /* 5 | Запускает указанную команду отдельным фоновым процессом без ожидания возврата результата 6 | */ 7 | declare v_pid integer = pg_background_launch(p_command); 8 | begin 9 | perform pg_sleep(0.1); 10 | perform pg_background_detach(v_pid); 11 | end; 12 | $$; -------------------------------------------------------------------------------- /12/docker-postgres/sql/db_target.sql: -------------------------------------------------------------------------------- 1 | -- 2 | -- code only for the target (additionally specified) database 3 | -- 4 | 5 | SET default_transaction_read_only = off; 6 | SET client_encoding = 'UTF8'; 7 | SET standard_conforming_strings = on; 8 | 9 | select current_database() as dbconnect \gset 10 | select rolname as role_deploy from pg_roles where rolname ilike '%deploy%' limit 1 \gset 11 | 12 | ALTER DATABASE :"dbconnect" OWNER TO :"role_deploy"; 13 | GRANT ALL ON DATABASE :"dbconnect" TO :"role_deploy"; 14 | ALTER DATABASE :"dbconnect" SET search_path = :DEV_SCHEMA, public, tiger; 15 | -------------------------------------------------------------------------------- /12/docker-postgres/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /12/docker-postgres/sql/post_warning.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not (setting ~ 'shared_ispell') as is_shared_ispell_notloaded from pg_settings where name ~ 'shared_preload_libraries' \gset 6 | \if :is_shared_ispell_notloaded 7 | \echo "" 8 | \echo "-- ================================================================================================================ --" 9 | \echo "Please, after the 1st start of the container with an empty database directory, сorrect in the postgreSQL.conf file," 10 | \echo "the 'shared_preload_libraries' parameter it must include the download of the 'shared_ispell' library " 11 | \echo "and re-run the script: update-extension.sh" 12 | \echo "-- ================================================================================================================ --" 13 | \endif 14 | -------------------------------------------------------------------------------- /12/docker-postgres/sql/replace_char_xml.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.replace_char_xml(p_str2xml text) RETURNS text 2 | LANGUAGE sql IMMUTABLE PARALLEL SAFE COST 10.0 3 | AS $$ 4 | select replace(replace(replace(replace(replace(p_str2xml,'&','&'),'''','''),'"','"'),'<','<'),'>','>'); 5 | $$; 6 | -------------------------------------------------------------------------------- /12/docker-postgres/sql/user_lookup.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 2 | LANGUAGE plpgsql SECURITY DEFINER 3 | AS $$ 4 | BEGIN 5 | SELECT usename, passwd FROM pg_catalog.pg_shadow 6 | WHERE usename = p_username INTO uname, phash; 7 | RETURN; 8 | END; 9 | $$; 10 | -------------------------------------------------------------------------------- /12/docker-postgres/sql/vw_locks.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_locks AS 2 | SELECT pg_locks.pid, 3 | pg_locks.virtualtransaction AS vxid, 4 | pg_locks.locktype AS lock_type, 5 | pg_locks.mode AS lock_mode, 6 | pg_locks.granted, 7 | CASE 8 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 9 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 10 | ELSE pg_locks.transactionid::text 11 | END AS xid_lock, 12 | pg_class.relname, 13 | pg_locks.page, 14 | pg_locks.tuple, 15 | pg_locks.classid, 16 | pg_locks.objid, 17 | pg_locks.objsubid 18 | FROM pg_locks 19 | LEFT JOIN pg_class ON pg_locks.relation = pg_class.oid 20 | WHERE pg_locks.pid <> pg_backend_pid() AND pg_locks.virtualtransaction IS DISTINCT FROM pg_locks.virtualxid 21 | ORDER BY pg_locks.pid, pg_locks.virtualtransaction, pg_locks.granted DESC, ( 22 | CASE 23 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 24 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 25 | ELSE pg_locks.transactionid::text 26 | END), pg_locks.locktype, pg_locks.mode, pg_class.relname; 27 | -------------------------------------------------------------------------------- /12/docker-postgres/sql/vw_partitions.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_partitions AS 2 | WITH RECURSIVE inheritance_tree AS ( 3 | SELECT c_1.oid AS table_oid, 4 | n.nspname AS table_schema, 5 | c_1.relname AS table_name, 6 | NULL::name AS table_parent_schema, 7 | NULL::name AS table_parent_name, 8 | c_1.relispartition AS is_partition 9 | FROM pg_class c_1 10 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 11 | WHERE c_1.relkind = 'p'::"char" AND c_1.relispartition = false 12 | UNION ALL 13 | SELECT inh.inhrelid AS table_oid, 14 | n.nspname AS table_schema, 15 | c_1.relname AS table_name, 16 | nn.nspname AS table_parent_schema, 17 | cc.relname AS table_parent_name, 18 | c_1.relispartition AS is_partition 19 | FROM inheritance_tree it_1 20 | JOIN pg_inherits inh ON inh.inhparent = it_1.table_oid 21 | JOIN pg_class c_1 ON inh.inhrelid = c_1.oid 22 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 23 | JOIN pg_class cc ON it_1.table_oid = cc.oid 24 | JOIN pg_namespace nn ON nn.oid = cc.relnamespace 25 | ) 26 | SELECT it.table_schema, 27 | it.table_name, 28 | c.reltuples, 29 | c.relpages, 30 | CASE p.partstrat 31 | WHEN 'l'::"char" THEN 'BY LIST'::text 32 | WHEN 'r'::"char" THEN 'BY RANGE'::text 33 | WHEN 'h'::"char" THEN 'BY HASH'::text 34 | ELSE 'not partitioned'::text 35 | END AS partitionin_type, 36 | it.table_parent_schema, 37 | it.table_parent_name, 38 | pg_get_expr(c.relpartbound, c.oid, true) AS partitioning_values, 39 | pg_get_expr(p.partexprs, c.oid, true) AS sub_partitioning_values 40 | FROM inheritance_tree it 41 | JOIN pg_class c ON c.oid = it.table_oid 42 | LEFT JOIN pg_partitioned_table p ON p.partrelid = it.table_oid 43 | ORDER BY it.table_name, c.reltuples; -------------------------------------------------------------------------------- /12/docker-postgres/sql/vw_who.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.state, 5 | now() - pa.xact_start AS ts_age, 6 | clock_timestamp() - pa.xact_start AS xact_age, 7 | clock_timestamp() - pa.query_start AS query_age, 8 | clock_timestamp() - pa.state_change AS change_age, 9 | pa.datname, 10 | pa.usename, 11 | pa.wait_event_type, 12 | pa.wait_event, 13 | pa.client_addr, 14 | pa.client_port, 15 | pa.application_name, 16 | pa.backend_type, 17 | pa.query 18 | FROM pg_stat_activity pa 19 | WHERE pa.pid <> pg_backend_pid() 20 | ORDER BY pa.datname, pa.state, pa.xact_start; 21 | -------------------------------------------------------------------------------- /12/docker-postgres/sql/vw_who_13plus.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.leader_pid, 5 | pa.state, 6 | now() - pa.xact_start AS ts_age, 7 | clock_timestamp() - pa.xact_start AS xact_age, 8 | clock_timestamp() - pa.query_start AS query_age, 9 | clock_timestamp() - pa.state_change AS change_age, 10 | pa.datname, 11 | pa.usename, 12 | pa.wait_event_type, 13 | pa.wait_event, 14 | pa.client_addr, 15 | pa.client_port, 16 | pa.application_name, 17 | pa.backend_type, 18 | pa.query 19 | FROM pg_stat_activity pa 20 | WHERE pa.pid <> pg_backend_pid() 21 | ORDER BY pa.datname, pa.state, pa.xact_start, pa.leader_pid NULLS FIRST; 22 | -------------------------------------------------------------------------------- /12/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/12_1 /usr/share/postgres/12_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/12_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/12_1 /usr/share/postgres/12_1/tsearch_data 5 | # стартуем докер 6 | docker run --rm --name my_postgres_12 --shm-size 2147483648 -p 5433:5432/tcp --stop-timeout 60 \ 7 | -v /var/lib/pgsql/12_1/data:/var/lib/postgresql/data \ 8 | -v /var/log/postgresql1:/var/log/postgresql \ 9 | -v /mnt/pgbak2/:/mnt/pgbak \ 10 | -v /usr/share/postgres/12_1/tsearch_data:/usr/share/postgresql/tsearch_data \ 11 | -e POSTGRES_PASSWORD=postgres -e POSTGRES_HOST_AUTH_METHOD=trust -e DEPLOY_PASSWORD=postgres -e PGBOUNCER_PASSWORD=postgres -e TZ="Etc/UTC" \ 12 | grufos/postgres:12.18 \ 13 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" -c shared_ispell.max_size=70MB 14 | -------------------------------------------------------------------------------- /12/postgres-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | postgres: 5 | 6 | # image: grufos/postgres:12.18 7 | build: 8 | context: ./docker-postgres 9 | dockerfile: Dockerfile 10 | stop_grace_period: 60s 11 | shm_size: '2gb' 12 | command: | 13 | -c shared_preload_libraries='plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm' 14 | -c shared_ispell.max_size=70MB 15 | volumes: 16 | - "/var/lib/pgsql/12_1/data:/var/lib/postgresql/data" 17 | - "/var/log/postgresql1:/var/log/postgresql" 18 | - "/mnt/pgbak2/:/mnt/pgbak/" 19 | - "/usr/share/postgres/12_1/tsearch_data:/usr/share/postgresql/tsearch_data" 20 | - "/var/lib/pgsql/12_1/app_db_init_sql:/app_db_init_sql" 21 | ports: 22 | - "5433:5432" 23 | environment: 24 | ENV_DB_VALUE: DEV 25 | APP_DB: "My_db" 26 | APP_DB_PASSWORD: qweasdzxc 27 | # POSTGRES_INITDB_ARGS: "--locale=ru_RU.UTF8 --data-checksums" 28 | POSTGRES_PASSWORD: qweasdzxc 29 | POSTGRES_HOST_AUTH_METHOD: trust 30 | DEPLOY_PASSWORD: qweasdzxc 31 | PGBOUNCER_PASSWORD: zxcasdqwe 32 | # TZ: "Etc/UTC" 33 | TZ: "Europe/Moscow" 34 | EMAILTO: "DBA-PostgreSQL@company.ru" 35 | EMAIL_SERVER: "mail.company.ru" 36 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 37 | BACKUP_THREADS: "4" 38 | BACKUP_MODE: "" 39 | 40 | -------------------------------------------------------------------------------- /12/restore-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprorestore: 5 | build: 6 | context: ./docker-pgprorestore 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/12_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | BACKUP_THREADS: "4" 16 | # восстановление на указанную точку во времени 17 | # TARGET_TIME: "2020-10-22 06:00:00" 18 | # восстановление на указанный срез в архиве 19 | # TARGET_ID: "QILQ45" 20 | # если ни один из этих параметров не указан, то восстановление выполняется на состояние - latest (самое последнее состояние) -------------------------------------------------------------------------------- /12/show_backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup_show: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/mnt/pgbak2/:/mnt/pgbak/" 11 | 12 | environment: 13 | TZ: "Europe/Moscow" 14 | EMAILTO: "DBA-PostgreSQL@company.ru" 15 | EMAIL_SERVER: "mail.company.ru" 16 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 17 | EMAIL_SEND: "no" 18 | 19 | entrypoint: "/usr/local/bin/show.sh" 20 | -------------------------------------------------------------------------------- /13/analyze-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | analyze: 5 | build: 6 | context: ./docker-analyze 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/log/pgbouncer1:/var/log/pgbouncer" 12 | - "/var/log/mamonsu1:/var/log/mamonsu" 13 | 14 | environment: 15 | STAT_STATEMENTS: "true" 16 | # TZ: "Etc/UTC" 17 | TZ: "Europe/Moscow" 18 | PGPASSWORD: qweasdzxc 19 | # PGHOST: 10.10.2.139 20 | PGHOST: postgres 21 | PGPORT: 5432 22 | PGBHOST: pgbouncer 23 | PGBPORT: 6432 24 | -------------------------------------------------------------------------------- /13/backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/13_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | PGHOST: postgres 16 | PGPORT: 5432 17 | # PGUSER: "postgres" 18 | # PGPASSWORD: "qweasdzxc" 19 | EMAILTO: "DBA-PostgreSQL@company.ru" 20 | EMAIL_SERVER: "mail.company.ru" 21 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 22 | BACKUP_THREADS: "4" 23 | BACKUP_MODE: "" 24 | BACKUP_STREAM: "yes" 25 | -------------------------------------------------------------------------------- /13/bin/analyze_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "analyze-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /13/bin/backup_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /13/bin/check_cluster_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "check_cluster_service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /13/bin/clear_all_docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # docker system prune -a # чистка всех образов в каталоге /var/lib/docker/overlay2 3 | docker stop $(docker ps -q) 4 | docker rm -v $(docker ps -aq -f status=exited) 5 | docker rmi $(docker image ls -q) -f 6 | docker rmi $(docker image ls -q) -f 7 | -------------------------------------------------------------------------------- /13/bin/docker_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # получает через пробел имена контейнеров для сборки. Если не указано, то принимается такая строка: 4 | # pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore 5 | # 6 | VERSION=13 7 | 8 | set -euo pipefail 9 | 10 | if [[ $# -ne 0 ]]; then 11 | LISTDOCKER=$@ 12 | else 13 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 14 | fi 15 | 16 | for param in $LISTDOCKER 17 | do 18 | cd docker-$param 19 | dir=`pwd` 20 | echo "" 21 | echo "=====================================" 22 | echo " $dir" 23 | echo "=====================================" 24 | echo "" 25 | docker build --no-cache . -t ${VERSION}_$param:latest 26 | cd .. 27 | done 28 | 29 | docker image ls --all 30 | -------------------------------------------------------------------------------- /13/bin/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker run -p 127.0.0.1:5433:5432/tcp --shm-size 2147483648 \ 3 | -e POSTGRES_PASSWORD=postgres \ 4 | -e POSTGRES_HOST_AUTH_METHOD=trust \ 5 | -e DEPLOY_PASSWORD=postgres \ 6 | -e TZ="Etc/UTC" \ 7 | grufos/postgres:13.14 \ 8 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" \ 9 | -c shared_ispell.max_size=70MB 10 | -------------------------------------------------------------------------------- /13/bin/harbor_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=13 3 | MINOR=14 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | PROJECT=dba_postgres 8 | URL=harbor.company.ru 9 | ACCOUNT="${URL}/${PROJECT}" 10 | LATEST_PUSH='no' 11 | 12 | set -euo pipefail 13 | 14 | if [[ $# -ne 0 ]]; then 15 | LISTDOCKER=$@ 16 | else 17 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 18 | fi 19 | 20 | for param in $LISTDOCKER 21 | do 22 | if [ "$param" = "pgbouncer" ]; then 23 | vers="${VERS_BOUNCER}" 24 | elif [ "$param" = "mamonsu" ]; then 25 | vers="${VERSION}_${VERS_MAMONSU}" 26 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 27 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 28 | else 29 | vers="${VERSION}.${MINOR}" 30 | fi 31 | echo "=======================" 32 | echo "${param} -> ${vers}" 33 | echo "=======================" 34 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 35 | echo " push ..." 36 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 37 | if [ "$LATEST_PUSH" = "yes" ]; then 38 | docker push ${ACCOUNT}/${param}:latest 39 | fi 40 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 41 | docker push ${ACCOUNT}/${param}:${vers} 42 | fi 43 | done 44 | -------------------------------------------------------------------------------- /13/bin/hub_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=13 3 | MINOR=14 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | ACCOUNT=grufos 8 | LATEST_PUSH='no' 9 | 10 | set -euo pipefail 11 | 12 | if [[ $# -ne 0 ]]; then 13 | LISTDOCKER=$@ 14 | else 15 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 16 | fi 17 | 18 | for param in $LISTDOCKER 19 | do 20 | if [ "$param" = "pgbouncer" ]; then 21 | vers="${VERS_BOUNCER}" 22 | elif [ "$param" = "mamonsu" ]; then 23 | vers="${VERSION}_${VERS_MAMONSU}" 24 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 25 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 26 | else 27 | vers="${VERSION}.${MINOR}" 28 | fi 29 | echo "=======================" 30 | echo "${param} -> ${vers}" 31 | echo "=======================" 32 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 33 | echo " push ..." 34 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 35 | if [ "$LATEST_PUSH" = "yes" ]; then 36 | docker push ${ACCOUNT}/${param}:latest 37 | fi 38 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 39 | docker push ${ACCOUNT}/${param}:${vers} 40 | fi 41 | done 42 | -------------------------------------------------------------------------------- /13/bin/postgres_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/postgresql1/* 8 | docker-compose -f "postgres-service.yml" up --build "$@" 9 | -------------------------------------------------------------------------------- /13/bin/postgres_start_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_all.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /13/bin/postgres_start_pgb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_pgb.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /13/bin/restore_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "restore-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /13/bin/show_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "show_backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /13/check_cluster_service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprocheckdb: 5 | build: 6 | context: ./docker-pgprocheckdb 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/lib/pgsql/13_1/data:/var/lib/postgresql/data" 12 | - "/mnt/pgbak2/:/mnt/pgbak/" 13 | 14 | environment: 15 | TZ: "Europe/Moscow" 16 | EMAILTO: "DBA-PostgreSQL@company.ru" 17 | EMAIL_SERVER: "mail.company.ru" 18 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 19 | EMAIL_SEND: "no" 20 | PGHOST: "postgres" 21 | PGPORT: "5432" 22 | PGUSER: "postgres" 23 | PGPASSWORD: "qweasdzxc" 24 | BACKUP_THREADS: "4" 25 | AMCHECK: "true" 26 | HEAPALLINDEXED: "true" 27 | 28 | -------------------------------------------------------------------------------- /13/docker-analyze/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 13 10 | ENV BACKUP_PATH /mnt/pgbak 11 | 12 | # explicitly set user/group IDs 13 | RUN set -eux; \ 14 | groupadd -r postgres --gid=999; \ 15 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 16 | mkdir -p /var/lib/postgresql/data; 17 | 18 | RUN apt-get update \ 19 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail bzip2 pgbadger \ 20 | # ... install psql ... 21 | && echo "deb http://apt.postgresql.org/pub/repos/apt $DEBIAN_RELEASE-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 22 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 23 | && apt-get update \ 24 | && apt-get install -y --no-install-recommends postgresql-client-$PG_MAJOR \ 25 | # ... create dirs ... 26 | && mkdir -p /var/log/postgresql/report \ 27 | && mkdir -p /var/log/pgbouncer \ 28 | && mkdir -p /var/log/mamonsu \ 29 | # ... cleaning ... 30 | && apt-get -f install \ 31 | && apt-get -y autoremove \ 32 | && apt-get -y clean \ 33 | && apt-get -y autoclean \ 34 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 35 | 36 | COPY ./analyze_log.sh /usr/local/bin 37 | COPY ./pg_stat_statements_report.sql /var/lib/postgresql 38 | 39 | RUN chown postgres:postgres /var/lib/postgresql/*.sql \ 40 | && chown -R postgres:postgres /var/log/postgresql/report \ 41 | && chown -R postgres:postgres /var/log/pgbouncer \ 42 | && chown -R postgres:postgres /var/log/mamonsu \ 43 | && chmod +x /usr/local/bin/*.sh 44 | 45 | USER postgres 46 | ENTRYPOINT [ "/usr/local/bin/analyze_log.sh" ] 47 | -------------------------------------------------------------------------------- /13/docker-mamonsu/bootstrap_post.sql: -------------------------------------------------------------------------------- 1 | select 'GRANT EXECUTE ON FUNCTION mamonsu.' || oid::regprocedure || ' TO mamonsu;' from pg_proc where pronamespace = 'mamonsu'::regnamespace \gexec 2 | -------------------------------------------------------------------------------- /13/docker-mamonsu/mamonsu_right_add.sql: -------------------------------------------------------------------------------- 1 | select not pg_is_in_recovery() as is_master \gset 2 | \if :is_master 3 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 4 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 5 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 6 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 7 | select current_database() = 'mamonsu' as is_mamonsu_db \gset 8 | \if :is_mamonsu_db 9 | select '''' || case when current_setting('shared_buffers') like '%GB' 10 | then (replace(current_setting('shared_buffers'), 'GB', '')::int)*1024 11 | else replace(current_setting('shared_buffers'), 'MB', '')::int 12 | end * 0.0117 || ' MB''' as highpage_mb \gset 13 | ALTER FUNCTION mamonsu.buffer_cache() SET WORK_MEM = :highpage_mb; -- for shared_buffers 16 Гб 200 Мб 14 | GRANT USAGE ON SCHEMA public TO mamonsu; 15 | GRANT EXECUTE ON FUNCTION public.pg_stat_statements(boolean) TO mamonsu; 16 | \endif 17 | -- we give the right to connect for the role of mamonsu 18 | do $$ begin execute 'GRANT CONNECT ON DATABASE "' || current_database() || '" TO mamonsu; '; end $$; 19 | -- 20 | CREATE SCHEMA IF NOT EXISTS pgbouncer; 21 | GRANT CONNECT ON DATABASE mamonsu TO pgbouncer; 22 | GRANT USAGE ON SCHEMA pgbouncer TO pgbouncer; 23 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 24 | LANGUAGE plpgsql SECURITY DEFINER 25 | AS $$ 26 | BEGIN 27 | SELECT usename, passwd FROM pg_catalog.pg_shadow 28 | WHERE usename = p_username INTO uname, phash; 29 | RETURN; 30 | END; 31 | $$; 32 | \endif 33 | -------------------------------------------------------------------------------- /13/docker-mamonsu/pre.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not pg_is_in_recovery() as is_master \gset 6 | \if :is_master 7 | select not exists(select true FROM pg_catalog.pg_database where datname='mamonsu') as is_db_mamonsu \gset 8 | \if :is_db_mamonsu 9 | CREATE DATABASE mamonsu; 10 | \endif 11 | \c mamonsu 12 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 13 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 14 | -- check role mamonsu ... 15 | select not exists(select * from pg_roles where rolname = 'mamonsu') as is_role_mamonsu \gset 16 | \if :is_role_mamonsu 17 | select :'MAMONSU_PASSWORD' = '' as is_mamonsu_password_exists \gset 18 | \if :is_mamonsu_password_exists 19 | CREATE ROLE mamonsu LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 20 | \else 21 | CREATE ROLE mamonsu LOGIN PASSWORD :'MAMONSU_PASSWORD' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 22 | \endif 23 | \else 24 | select :'MAMONSU_PASSWORD' <> '' as is_mamonsu_password_notexists \gset 25 | \if :is_mamonsu_password_notexists 26 | ALTER ROLE mamonsu WITH PASSWORD :'MAMONSU_PASSWORD' ; 27 | \endif 28 | \endif 29 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 30 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 31 | \endif 32 | 33 | -- get list all current DBs 34 | select string_agg(datname,' ') from pg_catalog.pg_database where not datistemplate; 35 | -------------------------------------------------------------------------------- /13/docker-pgprobackup/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /13/docker-pgprobackup/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /13/docker-pgprocheckdb/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /13/docker-pgprocheckdb/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /13/docker-pgprorestore/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 13 10 | ENV PGDATA /var/lib/postgresql/data 11 | ENV BACKUP_PATH /mnt/pgbak 12 | 13 | # explicitly set user/group IDs 14 | RUN set -eux; \ 15 | groupadd -r postgres --gid=999; \ 16 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 17 | mkdir -p /var/lib/postgresql/data; \ 18 | chown -R postgres:postgres /var/lib/postgresql 19 | 20 | RUN apt-get update \ 21 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail jq \ 22 | # подключаем репозитарий сообщества PostgreSQL 23 | && echo "deb http://apt.postgresql.org/pub/repos/apt ${DEBIAN_RELEASE}-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 24 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 25 | # подключаем репозитарий архивной утилиты 26 | && echo "deb [arch=amd64] https://repo.postgrespro.ru/pg_probackup/deb/ $DEBIAN_RELEASE main-$DEBIAN_RELEASE" > /etc/apt/sources.list.d/pg_probackup.list \ 27 | && wget -qO - https://repo.postgrespro.ru/pg_probackup/keys/GPG-KEY-PG-PROBACKUP | tee /etc/apt/trusted.gpg.d/pg_probackup.asc \ 28 | # ... updating ... 29 | && apt-get update \ 30 | && apt-get install -y --no-install-recommends \ 31 | pg-probackup-$PG_MAJOR \ 32 | && mkdir -p $BACKUP_PATH \ 33 | && chown -R postgres:postgres $BACKUP_PATH \ 34 | # ... cleaning ... 35 | && apt-get -f install \ 36 | && apt-get -y autoremove \ 37 | && apt-get -y clean \ 38 | && apt-get -y autoclean \ 39 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 40 | 41 | COPY ./restore.sh /usr/local/bin 42 | COPY ./show.sh /usr/local/bin 43 | 44 | RUN chmod +x /usr/local/bin/*.sh 45 | 46 | ENTRYPOINT [ "/usr/local/bin/restore.sh" ] 47 | -------------------------------------------------------------------------------- /13/docker-pgprorestore/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$1" != "" ]; then 24 | EMAIL_SEND=$1 25 | fi 26 | 27 | if [ "$2" != "" ]; then 28 | EMAILTO="$2" 29 | fi 30 | 31 | if [ "$BACKUP_PATH" = "" ]; then 32 | BACKUP_PATH="/mnt/pgbak" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /13/docker-postgres/locales.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | date format = %Y-%m-%d %H:%M:%S.%z 3 | 4 | [en_US] 5 | date format = %Y-%m-%d %H:%M:%S.%z 6 | language = us_english 7 | charset = iso_1 8 | -------------------------------------------------------------------------------- /13/docker-postgres/pg_ident.conf: -------------------------------------------------------------------------------- 1 | # PostgreSQL User Name Maps 2 | # ========================= 3 | # 4 | # Refer to the PostgreSQL documentation, chapter "Client 5 | # Authentication" for a complete description. A short synopsis 6 | # follows. 7 | # 8 | # This file controls PostgreSQL user name mapping. It maps external 9 | # user names to their corresponding PostgreSQL user names. Records 10 | # are of the form: 11 | # 12 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 13 | # 14 | # (The uppercase quantities must be replaced by actual values.) 15 | # 16 | # MAPNAME is the (otherwise freely chosen) map name that was used in 17 | # pg_hba.conf. SYSTEM-USERNAME is the detected user name of the 18 | # client. PG-USERNAME is the requested PostgreSQL user name. The 19 | # existence of a record specifies that SYSTEM-USERNAME may connect as 20 | # PG-USERNAME. 21 | # 22 | # If SYSTEM-USERNAME starts with a slash (/), it will be treated as a 23 | # regular expression. Optionally this can contain a capture (a 24 | # parenthesized subexpression). The substring matching the capture 25 | # will be substituted for \1 (backslash-one) if present in 26 | # PG-USERNAME. 27 | # 28 | # Multiple maps may be specified in this file and used by pg_hba.conf. 29 | # 30 | # No map names are defined in the default configuration. If all 31 | # system user names and PostgreSQL user names are the same, you don't 32 | # need anything in this file. 33 | # 34 | # This file is read on server startup and when the postmaster receives 35 | # a SIGHUP signal. If you edit the file on a running system, you have 36 | # to SIGHUP the postmaster for the changes to take effect. You can 37 | # use "pg_ctl reload" to do that. 38 | 39 | # Put your actual configuration here 40 | # ---------------------------------- 41 | 42 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 43 | main postgres backup -------------------------------------------------------------------------------- /13/docker-postgres/postgres: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # this is start file for postgres 4 | 5 | # Check on the need to initialize the catalog of the FTS 6 | tar -xzkf /usr/share/postgresql/$PG_MAJOR/tsearch_data.tar.gz -C /usr/share/postgresql/tsearch_data/ > /dev/null 2>&1 7 | 8 | # start postgres process ... 9 | exec /usr/lib/postgresql/$PG_MAJOR/bin/postgres ${@} 10 | -------------------------------------------------------------------------------- /13/docker-postgres/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /13/docker-postgres/sql/background_start.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.background_start(p_command text) RETURNS void 2 | LANGUAGE plpgsql 3 | AS $$ 4 | /* 5 | Запускает указанную команду отдельным фоновым процессом без ожидания возврата результата 6 | */ 7 | declare v_pid integer = pg_background_launch(p_command); 8 | begin 9 | perform pg_sleep(0.1); 10 | perform pg_background_detach(v_pid); 11 | end; 12 | $$; -------------------------------------------------------------------------------- /13/docker-postgres/sql/db_target.sql: -------------------------------------------------------------------------------- 1 | -- 2 | -- code only for the target (additionally specified) database 3 | -- 4 | 5 | SET default_transaction_read_only = off; 6 | SET client_encoding = 'UTF8'; 7 | SET standard_conforming_strings = on; 8 | 9 | select current_database() as dbconnect \gset 10 | select rolname as role_deploy from pg_roles where rolname ilike '%deploy%' limit 1 \gset 11 | 12 | ALTER DATABASE :"dbconnect" OWNER TO :"role_deploy"; 13 | GRANT ALL ON DATABASE :"dbconnect" TO :"role_deploy"; 14 | ALTER DATABASE :"dbconnect" SET search_path = :DEV_SCHEMA, public, tiger; 15 | -------------------------------------------------------------------------------- /13/docker-postgres/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /13/docker-postgres/sql/post_warning.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not (setting ~ 'shared_ispell') as is_shared_ispell_notloaded from pg_settings where name ~ 'shared_preload_libraries' \gset 6 | \if :is_shared_ispell_notloaded 7 | \echo "" 8 | \echo "-- ================================================================================================================ --" 9 | \echo "Please, after the 1st start of the container with an empty database directory, сorrect in the postgreSQL.conf file," 10 | \echo "the 'shared_preload_libraries' parameter it must include the download of the 'shared_ispell' library " 11 | \echo "and re-run the script: update-extension.sh" 12 | \echo "-- ================================================================================================================ --" 13 | \endif 14 | -------------------------------------------------------------------------------- /13/docker-postgres/sql/replace_char_xml.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.replace_char_xml(p_str2xml text) RETURNS text 2 | LANGUAGE sql IMMUTABLE PARALLEL SAFE COST 10.0 3 | AS $$ 4 | select replace(replace(replace(replace(replace(p_str2xml,'&','&'),'''','''),'"','"'),'<','<'),'>','>'); 5 | $$; 6 | -------------------------------------------------------------------------------- /13/docker-postgres/sql/user_lookup.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 2 | LANGUAGE plpgsql SECURITY DEFINER 3 | AS $$ 4 | BEGIN 5 | SELECT usename, passwd FROM pg_catalog.pg_shadow 6 | WHERE usename = p_username INTO uname, phash; 7 | RETURN; 8 | END; 9 | $$; 10 | -------------------------------------------------------------------------------- /13/docker-postgres/sql/vw_locks.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_locks AS 2 | SELECT pg_locks.pid, 3 | pg_locks.virtualtransaction AS vxid, 4 | pg_locks.locktype AS lock_type, 5 | pg_locks.mode AS lock_mode, 6 | pg_locks.granted, 7 | CASE 8 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 9 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 10 | ELSE pg_locks.transactionid::text 11 | END AS xid_lock, 12 | pg_class.relname, 13 | pg_locks.page, 14 | pg_locks.tuple, 15 | pg_locks.classid, 16 | pg_locks.objid, 17 | pg_locks.objsubid 18 | FROM pg_locks 19 | LEFT JOIN pg_class ON pg_locks.relation = pg_class.oid 20 | WHERE pg_locks.pid <> pg_backend_pid() AND pg_locks.virtualtransaction IS DISTINCT FROM pg_locks.virtualxid 21 | ORDER BY pg_locks.pid, pg_locks.virtualtransaction, pg_locks.granted DESC, ( 22 | CASE 23 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 24 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 25 | ELSE pg_locks.transactionid::text 26 | END), pg_locks.locktype, pg_locks.mode, pg_class.relname; 27 | -------------------------------------------------------------------------------- /13/docker-postgres/sql/vw_partitions.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_partitions AS 2 | WITH RECURSIVE inheritance_tree AS ( 3 | SELECT c_1.oid AS table_oid, 4 | n.nspname AS table_schema, 5 | c_1.relname AS table_name, 6 | NULL::name AS table_parent_schema, 7 | NULL::name AS table_parent_name, 8 | c_1.relispartition AS is_partition 9 | FROM pg_class c_1 10 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 11 | WHERE c_1.relkind = 'p'::"char" AND c_1.relispartition = false 12 | UNION ALL 13 | SELECT inh.inhrelid AS table_oid, 14 | n.nspname AS table_schema, 15 | c_1.relname AS table_name, 16 | nn.nspname AS table_parent_schema, 17 | cc.relname AS table_parent_name, 18 | c_1.relispartition AS is_partition 19 | FROM inheritance_tree it_1 20 | JOIN pg_inherits inh ON inh.inhparent = it_1.table_oid 21 | JOIN pg_class c_1 ON inh.inhrelid = c_1.oid 22 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 23 | JOIN pg_class cc ON it_1.table_oid = cc.oid 24 | JOIN pg_namespace nn ON nn.oid = cc.relnamespace 25 | ) 26 | SELECT it.table_schema, 27 | it.table_name, 28 | c.reltuples, 29 | c.relpages, 30 | CASE p.partstrat 31 | WHEN 'l'::"char" THEN 'BY LIST'::text 32 | WHEN 'r'::"char" THEN 'BY RANGE'::text 33 | WHEN 'h'::"char" THEN 'BY HASH'::text 34 | ELSE 'not partitioned'::text 35 | END AS partitionin_type, 36 | it.table_parent_schema, 37 | it.table_parent_name, 38 | pg_get_expr(c.relpartbound, c.oid, true) AS partitioning_values, 39 | pg_get_expr(p.partexprs, c.oid, true) AS sub_partitioning_values 40 | FROM inheritance_tree it 41 | JOIN pg_class c ON c.oid = it.table_oid 42 | LEFT JOIN pg_partitioned_table p ON p.partrelid = it.table_oid 43 | ORDER BY it.table_name, c.reltuples; -------------------------------------------------------------------------------- /13/docker-postgres/sql/vw_who.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.state, 5 | now() - pa.xact_start AS ts_age, 6 | clock_timestamp() - pa.xact_start AS xact_age, 7 | clock_timestamp() - pa.query_start AS query_age, 8 | clock_timestamp() - pa.state_change AS change_age, 9 | pa.datname, 10 | pa.usename, 11 | pa.wait_event_type, 12 | pa.wait_event, 13 | pa.client_addr, 14 | pa.client_port, 15 | pa.application_name, 16 | pa.backend_type, 17 | pa.query 18 | FROM pg_stat_activity pa 19 | WHERE pa.pid <> pg_backend_pid() 20 | ORDER BY pa.datname, pa.state, pa.xact_start; 21 | -------------------------------------------------------------------------------- /13/docker-postgres/sql/vw_who_13plus.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.leader_pid, 5 | pa.state, 6 | now() - pa.xact_start AS ts_age, 7 | clock_timestamp() - pa.xact_start AS xact_age, 8 | clock_timestamp() - pa.query_start AS query_age, 9 | clock_timestamp() - pa.state_change AS change_age, 10 | pa.datname, 11 | pa.usename, 12 | pa.wait_event_type, 13 | pa.wait_event, 14 | pa.client_addr, 15 | pa.client_port, 16 | pa.application_name, 17 | pa.backend_type, 18 | pa.query 19 | FROM pg_stat_activity pa 20 | WHERE pa.pid <> pg_backend_pid() 21 | ORDER BY pa.datname, pa.state, pa.xact_start, pa.leader_pid NULLS FIRST; 22 | -------------------------------------------------------------------------------- /13/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/13_1 /usr/share/postgres/13_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/13_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/13_1 /usr/share/postgres/13_1/tsearch_data 5 | # стартуем докер 6 | docker run --rm --name my_postgres_13 --shm-size 2147483648 -p 5433:5432/tcp --stop-timeout 60 \ 7 | -v /var/lib/pgsql/13_1/data:/var/lib/postgresql/data \ 8 | -v /var/log/postgresql1:/var/log/postgresql \ 9 | -v /mnt/pgbak2/:/mnt/pgbak \ 10 | -v /usr/share/postgres/13_1/tsearch_data:/usr/share/postgresql/tsearch_data \ 11 | -e POSTGRES_PASSWORD=postgres -e POSTGRES_HOST_AUTH_METHOD=trust -e DEPLOY_PASSWORD=postgres -e PGBOUNCER_PASSWORD=postgres -e TZ="Etc/UTC" \ 12 | grufos/postgres:13.14 \ 13 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" -c shared_ispell.max_size=70MB 14 | -------------------------------------------------------------------------------- /13/postgres-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | postgres: 5 | 6 | # image: grufos/postgres:13.14 7 | build: 8 | context: ./docker-postgres 9 | dockerfile: Dockerfile 10 | stop_grace_period: 60s 11 | shm_size: '2gb' 12 | command: | 13 | -c shared_preload_libraries='plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm' 14 | -c shared_ispell.max_size=70MB 15 | volumes: 16 | - "/var/lib/pgsql/13_1/data:/var/lib/postgresql/data" 17 | - "/var/log/postgresql1:/var/log/postgresql" 18 | - "/mnt/pgbak2/:/mnt/pgbak/" 19 | - "/usr/share/postgres/13_1/tsearch_data:/usr/share/postgresql/tsearch_data" 20 | - "/var/lib/pgsql/13_1/app_db_init_sql:/app_db_init_sql" 21 | ports: 22 | - "5433:5432" 23 | environment: 24 | ENV_DB_VALUE: DEV 25 | APP_DB: "My_db" 26 | APP_DB_PASSWORD: qweasdzxc 27 | # POSTGRES_INITDB_ARGS: "--locale=ru_RU.UTF8 --data-checksums" 28 | POSTGRES_PASSWORD: qweasdzxc 29 | POSTGRES_HOST_AUTH_METHOD: trust 30 | DEPLOY_PASSWORD: qweasdzxc 31 | PGBOUNCER_PASSWORD: zxcasdqwe 32 | # TZ: "Etc/UTC" 33 | TZ: "Europe/Moscow" 34 | EMAILTO: "DBA-PostgreSQL@company.ru" 35 | EMAIL_SERVER: "mail.company.ru" 36 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 37 | BACKUP_THREADS: "4" 38 | BACKUP_MODE: "" 39 | 40 | -------------------------------------------------------------------------------- /13/restore-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprorestore: 5 | build: 6 | context: ./docker-pgprorestore 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/13_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | BACKUP_THREADS: "4" 16 | # восстановление на указанную точку во времени 17 | # TARGET_TIME: "2020-10-22 06:00:00" 18 | # восстановление на указанный срез в архиве 19 | # TARGET_ID: "QILQ45" 20 | # если ни один из этих параметров не указан, то восстановление выполняется на состояние - latest (самое последнее состояние) -------------------------------------------------------------------------------- /13/show_backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup_show: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/mnt/pgbak2/:/mnt/pgbak/" 11 | 12 | environment: 13 | TZ: "Europe/Moscow" 14 | EMAILTO: "DBA-PostgreSQL@company.ru" 15 | EMAIL_SERVER: "mail.company.ru" 16 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 17 | EMAIL_SEND: "no" 18 | 19 | entrypoint: "/usr/local/bin/show.sh" 20 | -------------------------------------------------------------------------------- /14/analyze-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | analyze: 5 | build: 6 | context: ./docker-analyze 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/log/pgbouncer1:/var/log/pgbouncer" 12 | - "/var/log/mamonsu1:/var/log/mamonsu" 13 | 14 | environment: 15 | STAT_STATEMENTS: "true" 16 | # TZ: "Etc/UTC" 17 | TZ: "Europe/Moscow" 18 | PGPASSWORD: qweasdzxc 19 | # PGHOST: 10.10.2.139 20 | PGHOST: postgres 21 | PGPORT: 5432 22 | PGBHOST: pgbouncer 23 | PGBPORT: 6432 24 | -------------------------------------------------------------------------------- /14/backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/14_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | PGHOST: postgres 16 | PGPORT: 5432 17 | # PGUSER: "postgres" 18 | # PGPASSWORD: "qweasdzxc" 19 | EMAILTO: "DBA-PostgreSQL@company.ru" 20 | EMAIL_SERVER: "mail.company.ru" 21 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 22 | BACKUP_THREADS: "4" 23 | BACKUP_MODE: "" 24 | BACKUP_STREAM: "yes" 25 | -------------------------------------------------------------------------------- /14/bin/analyze_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "analyze-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /14/bin/backup_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /14/bin/check_cluster_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "check_cluster_service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /14/bin/clear_all_docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # docker system prune -a # чистка всех образов в каталоге /var/lib/docker/overlay2 3 | docker stop $(docker ps -q) 4 | docker rm -v $(docker ps -aq -f status=exited) 5 | docker rmi $(docker image ls -q) -f 6 | docker rmi $(docker image ls -q) -f 7 | -------------------------------------------------------------------------------- /14/bin/docker_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # получает через пробел имена контейнеров для сборки. Если не указано, то принимается такая строка: 4 | # pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore 5 | # 6 | VERSION=14 7 | 8 | set -euo pipefail 9 | 10 | if [[ $# -ne 0 ]]; then 11 | LISTDOCKER=$@ 12 | else 13 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 14 | fi 15 | 16 | for param in $LISTDOCKER 17 | do 18 | cd docker-$param 19 | dir=`pwd` 20 | echo "" 21 | echo "=====================================" 22 | echo " $dir" 23 | echo "=====================================" 24 | echo "" 25 | docker build --no-cache . -t ${VERSION}_$param:latest 26 | cd .. 27 | done 28 | 29 | docker image ls --all 30 | -------------------------------------------------------------------------------- /14/bin/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker run -p 127.0.0.1:5433:5432/tcp --shm-size 2147483648 \ 3 | -e POSTGRES_PASSWORD=postgres \ 4 | -e POSTGRES_HOST_AUTH_METHOD=trust \ 5 | -e DEPLOY_PASSWORD=postgres \ 6 | -e TZ="Etc/UTC" \ 7 | grufos/postgres:14.11 \ 8 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" \ 9 | -c shared_ispell.max_size=70MB 10 | -------------------------------------------------------------------------------- /14/bin/harbor_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=14 3 | MINOR=11 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | PROJECT=dba_postgres 8 | URL=harbor.company.ru 9 | ACCOUNT="${URL}/${PROJECT}" 10 | LATEST_PUSH='no' 11 | 12 | set -euo pipefail 13 | 14 | if [[ $# -ne 0 ]]; then 15 | LISTDOCKER=$@ 16 | else 17 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 18 | fi 19 | 20 | for param in $LISTDOCKER 21 | do 22 | if [ "$param" = "pgbouncer" ]; then 23 | vers="${VERS_BOUNCER}" 24 | elif [ "$param" = "mamonsu" ]; then 25 | vers="${VERSION}_${VERS_MAMONSU}" 26 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 27 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 28 | else 29 | vers="${VERSION}.${MINOR}" 30 | fi 31 | echo "=======================" 32 | echo "${param} -> ${vers}" 33 | echo "=======================" 34 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 35 | echo " push ..." 36 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 37 | if [ "$LATEST_PUSH" = "yes" ]; then 38 | docker push ${ACCOUNT}/${param}:latest 39 | fi 40 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 41 | docker push ${ACCOUNT}/${param}:${vers} 42 | fi 43 | done 44 | -------------------------------------------------------------------------------- /14/bin/hub_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=14 3 | MINOR=11 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | ACCOUNT=grufos 8 | LATEST_PUSH='no' 9 | 10 | set -euo pipefail 11 | 12 | if [[ $# -ne 0 ]]; then 13 | LISTDOCKER=$@ 14 | else 15 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 16 | fi 17 | 18 | for param in $LISTDOCKER 19 | do 20 | if [ "$param" = "pgbouncer" ]; then 21 | vers="${VERS_BOUNCER}" 22 | elif [ "$param" = "mamonsu" ]; then 23 | vers="${VERSION}_${VERS_MAMONSU}" 24 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 25 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 26 | else 27 | vers="${VERSION}.${MINOR}" 28 | fi 29 | echo "=======================" 30 | echo "${param} -> ${vers}" 31 | echo "=======================" 32 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 33 | echo " push ..." 34 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 35 | if [ "$LATEST_PUSH" = "yes" ]; then 36 | docker push ${ACCOUNT}/${param}:latest 37 | fi 38 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 39 | docker push ${ACCOUNT}/${param}:${vers} 40 | fi 41 | done 42 | -------------------------------------------------------------------------------- /14/bin/postgres_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/postgresql1/* 8 | docker-compose -f "postgres-service.yml" up --build "$@" 9 | -------------------------------------------------------------------------------- /14/bin/postgres_start_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_all.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /14/bin/postgres_start_pgb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_pgb.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /14/bin/restore_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "restore-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /14/bin/show_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "show_backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /14/check_cluster_service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprocheckdb: 5 | build: 6 | context: ./docker-pgprocheckdb 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/lib/pgsql/14_1/data:/var/lib/postgresql/data" 12 | - "/mnt/pgbak2/:/mnt/pgbak/" 13 | 14 | environment: 15 | TZ: "Europe/Moscow" 16 | EMAILTO: "DBA-PostgreSQL@company.ru" 17 | EMAIL_SERVER: "mail.company.ru" 18 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 19 | EMAIL_SEND: "no" 20 | PGHOST: "postgres" 21 | PGPORT: "5432" 22 | PGUSER: "postgres" 23 | PGPASSWORD: "qweasdzxc" 24 | BACKUP_THREADS: "4" 25 | AMCHECK: "true" 26 | HEAPALLINDEXED: "true" 27 | 28 | -------------------------------------------------------------------------------- /14/docker-analyze/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 14 10 | ENV BACKUP_PATH /mnt/pgbak 11 | 12 | # explicitly set user/group IDs 13 | RUN set -eux; \ 14 | groupadd -r postgres --gid=999; \ 15 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 16 | mkdir -p /var/lib/postgresql/data; 17 | 18 | RUN apt-get update \ 19 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail bzip2 pgbadger \ 20 | # ... install psql ... 21 | && echo "deb http://apt.postgresql.org/pub/repos/apt $DEBIAN_RELEASE-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 22 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 23 | && apt-get update \ 24 | && apt-get install -y --no-install-recommends postgresql-client-$PG_MAJOR \ 25 | # ... create dirs ... 26 | && mkdir -p /var/log/postgresql/report \ 27 | && mkdir -p /var/log/pgbouncer \ 28 | && mkdir -p /var/log/mamonsu \ 29 | # ... cleaning ... 30 | && apt-get -f install \ 31 | && apt-get -y autoremove \ 32 | && apt-get -y clean \ 33 | && apt-get -y autoclean \ 34 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 35 | 36 | COPY ./analyze_log.sh /usr/local/bin 37 | COPY ./pg_stat_statements_report.sql /var/lib/postgresql 38 | 39 | RUN chown postgres:postgres /var/lib/postgresql/*.sql \ 40 | && chown -R postgres:postgres /var/log/postgresql/report \ 41 | && chown -R postgres:postgres /var/log/pgbouncer \ 42 | && chown -R postgres:postgres /var/log/mamonsu \ 43 | && chmod +x /usr/local/bin/*.sh 44 | 45 | USER postgres 46 | ENTRYPOINT [ "/usr/local/bin/analyze_log.sh" ] 47 | -------------------------------------------------------------------------------- /14/docker-mamonsu/bootstrap_post.sql: -------------------------------------------------------------------------------- 1 | select 'GRANT EXECUTE ON FUNCTION mamonsu.' || oid::regprocedure || ' TO mamonsu;' from pg_proc where pronamespace = 'mamonsu'::regnamespace \gexec 2 | -------------------------------------------------------------------------------- /14/docker-mamonsu/mamonsu_right_add.sql: -------------------------------------------------------------------------------- 1 | select not pg_is_in_recovery() as is_master \gset 2 | \if :is_master 3 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 4 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 5 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 6 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 7 | select current_database() = 'mamonsu' as is_mamonsu_db \gset 8 | \if :is_mamonsu_db 9 | select '''' || case when current_setting('shared_buffers') like '%GB' 10 | then (replace(current_setting('shared_buffers'), 'GB', '')::int)*1024 11 | else replace(current_setting('shared_buffers'), 'MB', '')::int 12 | end * 0.0117 || ' MB''' as highpage_mb \gset 13 | ALTER FUNCTION mamonsu.buffer_cache() SET WORK_MEM = :highpage_mb; -- for shared_buffers 16 Гб 200 Мб 14 | GRANT USAGE ON SCHEMA public TO mamonsu; 15 | GRANT EXECUTE ON FUNCTION public.pg_stat_statements(boolean) TO mamonsu; 16 | \endif 17 | -- we give the right to connect for the role of mamonsu 18 | do $$ begin execute 'GRANT CONNECT ON DATABASE "' || current_database() || '" TO mamonsu; '; end $$; 19 | -- 20 | CREATE SCHEMA IF NOT EXISTS pgbouncer; 21 | GRANT CONNECT ON DATABASE mamonsu TO pgbouncer; 22 | GRANT USAGE ON SCHEMA pgbouncer TO pgbouncer; 23 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 24 | LANGUAGE plpgsql SECURITY DEFINER 25 | AS $$ 26 | BEGIN 27 | SELECT usename, passwd FROM pg_catalog.pg_shadow 28 | WHERE usename = p_username INTO uname, phash; 29 | RETURN; 30 | END; 31 | $$; 32 | \endif 33 | -------------------------------------------------------------------------------- /14/docker-mamonsu/pre.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not pg_is_in_recovery() as is_master \gset 6 | \if :is_master 7 | select not exists(select true FROM pg_catalog.pg_database where datname='mamonsu') as is_db_mamonsu \gset 8 | \if :is_db_mamonsu 9 | CREATE DATABASE mamonsu; 10 | \endif 11 | \c mamonsu 12 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 13 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 14 | -- check role mamonsu ... 15 | select not exists(select * from pg_roles where rolname = 'mamonsu') as is_role_mamonsu \gset 16 | \if :is_role_mamonsu 17 | select :'MAMONSU_PASSWORD' = '' as is_mamonsu_password_exists \gset 18 | \if :is_mamonsu_password_exists 19 | CREATE ROLE mamonsu LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 20 | \else 21 | CREATE ROLE mamonsu LOGIN PASSWORD :'MAMONSU_PASSWORD' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 22 | \endif 23 | \else 24 | select :'MAMONSU_PASSWORD' <> '' as is_mamonsu_password_notexists \gset 25 | \if :is_mamonsu_password_notexists 26 | ALTER ROLE mamonsu WITH PASSWORD :'MAMONSU_PASSWORD' ; 27 | \endif 28 | \endif 29 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 30 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 31 | \endif 32 | 33 | -- get list all current DBs 34 | select string_agg(datname,' ') from pg_catalog.pg_database where not datistemplate; 35 | -------------------------------------------------------------------------------- /14/docker-pgprobackup/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /14/docker-pgprobackup/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /14/docker-pgprocheckdb/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /14/docker-pgprocheckdb/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /14/docker-pgprorestore/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 14 10 | ENV PGDATA /var/lib/postgresql/data 11 | ENV BACKUP_PATH /mnt/pgbak 12 | 13 | # explicitly set user/group IDs 14 | RUN set -eux; \ 15 | groupadd -r postgres --gid=999; \ 16 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 17 | mkdir -p /var/lib/postgresql/data; \ 18 | chown -R postgres:postgres /var/lib/postgresql 19 | 20 | RUN apt-get update \ 21 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail jq \ 22 | # подключаем репозитарий сообщества PostgreSQL 23 | && echo "deb http://apt.postgresql.org/pub/repos/apt ${DEBIAN_RELEASE}-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 24 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 25 | # подключаем репозитарий архивной утилиты 26 | && echo "deb [arch=amd64] https://repo.postgrespro.ru/pg_probackup/deb/ $DEBIAN_RELEASE main-$DEBIAN_RELEASE" > /etc/apt/sources.list.d/pg_probackup.list \ 27 | && wget -qO - https://repo.postgrespro.ru/pg_probackup/keys/GPG-KEY-PG-PROBACKUP | tee /etc/apt/trusted.gpg.d/pg_probackup.asc \ 28 | # ... updating ... 29 | && apt-get update \ 30 | && apt-get install -y --no-install-recommends \ 31 | pg-probackup-$PG_MAJOR \ 32 | && mkdir -p $BACKUP_PATH \ 33 | && chown -R postgres:postgres $BACKUP_PATH \ 34 | # ... cleaning ... 35 | && apt-get -f install \ 36 | && apt-get -y autoremove \ 37 | && apt-get -y clean \ 38 | && apt-get -y autoclean \ 39 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 40 | 41 | COPY ./restore.sh /usr/local/bin 42 | COPY ./show.sh /usr/local/bin 43 | 44 | RUN chmod +x /usr/local/bin/*.sh 45 | 46 | ENTRYPOINT [ "/usr/local/bin/restore.sh" ] 47 | -------------------------------------------------------------------------------- /14/docker-pgprorestore/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$1" != "" ]; then 24 | EMAIL_SEND=$1 25 | fi 26 | 27 | if [ "$2" != "" ]; then 28 | EMAILTO="$2" 29 | fi 30 | 31 | if [ "$BACKUP_PATH" = "" ]; then 32 | BACKUP_PATH="/mnt/pgbak" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /14/docker-postgres/locales.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | date format = %Y-%m-%d %H:%M:%S.%z 3 | 4 | [en_US] 5 | date format = %Y-%m-%d %H:%M:%S.%z 6 | language = us_english 7 | charset = iso_1 8 | -------------------------------------------------------------------------------- /14/docker-postgres/pg_ident.conf: -------------------------------------------------------------------------------- 1 | # PostgreSQL User Name Maps 2 | # ========================= 3 | # 4 | # Refer to the PostgreSQL documentation, chapter "Client 5 | # Authentication" for a complete description. A short synopsis 6 | # follows. 7 | # 8 | # This file controls PostgreSQL user name mapping. It maps external 9 | # user names to their corresponding PostgreSQL user names. Records 10 | # are of the form: 11 | # 12 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 13 | # 14 | # (The uppercase quantities must be replaced by actual values.) 15 | # 16 | # MAPNAME is the (otherwise freely chosen) map name that was used in 17 | # pg_hba.conf. SYSTEM-USERNAME is the detected user name of the 18 | # client. PG-USERNAME is the requested PostgreSQL user name. The 19 | # existence of a record specifies that SYSTEM-USERNAME may connect as 20 | # PG-USERNAME. 21 | # 22 | # If SYSTEM-USERNAME starts with a slash (/), it will be treated as a 23 | # regular expression. Optionally this can contain a capture (a 24 | # parenthesized subexpression). The substring matching the capture 25 | # will be substituted for \1 (backslash-one) if present in 26 | # PG-USERNAME. 27 | # 28 | # Multiple maps may be specified in this file and used by pg_hba.conf. 29 | # 30 | # No map names are defined in the default configuration. If all 31 | # system user names and PostgreSQL user names are the same, you don't 32 | # need anything in this file. 33 | # 34 | # This file is read on server startup and when the postmaster receives 35 | # a SIGHUP signal. If you edit the file on a running system, you have 36 | # to SIGHUP the postmaster for the changes to take effect. You can 37 | # use "pg_ctl reload" to do that. 38 | 39 | # Put your actual configuration here 40 | # ---------------------------------- 41 | 42 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 43 | main postgres backup -------------------------------------------------------------------------------- /14/docker-postgres/postgres: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # this is start file for postgres 4 | 5 | # Check on the need to initialize the catalog of the FTS 6 | tar -xzkf /usr/share/postgresql/$PG_MAJOR/tsearch_data.tar.gz -C /usr/share/postgresql/tsearch_data/ > /dev/null 2>&1 7 | 8 | # start postgres process ... 9 | exec /usr/lib/postgresql/$PG_MAJOR/bin/postgres ${@} 10 | -------------------------------------------------------------------------------- /14/docker-postgres/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /14/docker-postgres/sql/background_start.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.background_start(p_command text) RETURNS void 2 | LANGUAGE plpgsql 3 | AS $$ 4 | /* 5 | Запускает указанную команду отдельным фоновым процессом без ожидания возврата результата 6 | */ 7 | declare v_pid integer = pg_background_launch(p_command); 8 | begin 9 | perform pg_sleep(0.1); 10 | perform pg_background_detach(v_pid); 11 | end; 12 | $$; -------------------------------------------------------------------------------- /14/docker-postgres/sql/db_target.sql: -------------------------------------------------------------------------------- 1 | -- 2 | -- code only for the target (additionally specified) database 3 | -- 4 | 5 | SET default_transaction_read_only = off; 6 | SET client_encoding = 'UTF8'; 7 | SET standard_conforming_strings = on; 8 | 9 | select current_database() as dbconnect \gset 10 | select rolname as role_deploy from pg_roles where rolname ilike '%deploy%' limit 1 \gset 11 | 12 | ALTER DATABASE :"dbconnect" OWNER TO :"role_deploy"; 13 | GRANT ALL ON DATABASE :"dbconnect" TO :"role_deploy"; 14 | ALTER DATABASE :"dbconnect" SET search_path = :DEV_SCHEMA, public, tiger; 15 | -------------------------------------------------------------------------------- /14/docker-postgres/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /14/docker-postgres/sql/post_warning.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not (setting ~ 'shared_ispell') as is_shared_ispell_notloaded from pg_settings where name ~ 'shared_preload_libraries' \gset 6 | \if :is_shared_ispell_notloaded 7 | \echo "" 8 | \echo "-- ================================================================================================================ --" 9 | \echo "Please, after the 1st start of the container with an empty database directory, сorrect in the postgreSQL.conf file," 10 | \echo "the 'shared_preload_libraries' parameter it must include the download of the 'shared_ispell' library " 11 | \echo "and re-run the script: update-extension.sh" 12 | \echo "-- ================================================================================================================ --" 13 | \endif 14 | -------------------------------------------------------------------------------- /14/docker-postgres/sql/replace_char_xml.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.replace_char_xml(p_str2xml text) RETURNS text 2 | LANGUAGE sql IMMUTABLE PARALLEL SAFE COST 10.0 3 | AS $$ 4 | select replace(replace(replace(replace(replace(p_str2xml,'&','&'),'''','''),'"','"'),'<','<'),'>','>'); 5 | $$; 6 | -------------------------------------------------------------------------------- /14/docker-postgres/sql/user_lookup.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 2 | LANGUAGE plpgsql SECURITY DEFINER 3 | AS $$ 4 | BEGIN 5 | SELECT usename, passwd FROM pg_catalog.pg_shadow 6 | WHERE usename = p_username INTO uname, phash; 7 | RETURN; 8 | END; 9 | $$; 10 | -------------------------------------------------------------------------------- /14/docker-postgres/sql/vw_locks.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_locks AS 2 | SELECT pg_locks.pid, 3 | pg_locks.virtualtransaction AS vxid, 4 | pg_locks.locktype AS lock_type, 5 | pg_locks.mode AS lock_mode, 6 | pg_locks.granted, 7 | CASE 8 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 9 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 10 | ELSE pg_locks.transactionid::text 11 | END AS xid_lock, 12 | pg_class.relname, 13 | pg_locks.page, 14 | pg_locks.tuple, 15 | pg_locks.classid, 16 | pg_locks.objid, 17 | pg_locks.objsubid 18 | FROM pg_locks 19 | LEFT JOIN pg_class ON pg_locks.relation = pg_class.oid 20 | WHERE pg_locks.pid <> pg_backend_pid() AND pg_locks.virtualtransaction IS DISTINCT FROM pg_locks.virtualxid 21 | ORDER BY pg_locks.pid, pg_locks.virtualtransaction, pg_locks.granted DESC, ( 22 | CASE 23 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 24 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 25 | ELSE pg_locks.transactionid::text 26 | END), pg_locks.locktype, pg_locks.mode, pg_class.relname; 27 | -------------------------------------------------------------------------------- /14/docker-postgres/sql/vw_partitions.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_partitions AS 2 | WITH RECURSIVE inheritance_tree AS ( 3 | SELECT c_1.oid AS table_oid, 4 | n.nspname AS table_schema, 5 | c_1.relname AS table_name, 6 | NULL::name AS table_parent_schema, 7 | NULL::name AS table_parent_name, 8 | c_1.relispartition AS is_partition 9 | FROM pg_class c_1 10 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 11 | WHERE c_1.relkind = 'p'::"char" AND c_1.relispartition = false 12 | UNION ALL 13 | SELECT inh.inhrelid AS table_oid, 14 | n.nspname AS table_schema, 15 | c_1.relname AS table_name, 16 | nn.nspname AS table_parent_schema, 17 | cc.relname AS table_parent_name, 18 | c_1.relispartition AS is_partition 19 | FROM inheritance_tree it_1 20 | JOIN pg_inherits inh ON inh.inhparent = it_1.table_oid 21 | JOIN pg_class c_1 ON inh.inhrelid = c_1.oid 22 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 23 | JOIN pg_class cc ON it_1.table_oid = cc.oid 24 | JOIN pg_namespace nn ON nn.oid = cc.relnamespace 25 | ) 26 | SELECT it.table_schema, 27 | it.table_name, 28 | c.reltuples, 29 | c.relpages, 30 | CASE p.partstrat 31 | WHEN 'l'::"char" THEN 'BY LIST'::text 32 | WHEN 'r'::"char" THEN 'BY RANGE'::text 33 | WHEN 'h'::"char" THEN 'BY HASH'::text 34 | ELSE 'not partitioned'::text 35 | END AS partitionin_type, 36 | it.table_parent_schema, 37 | it.table_parent_name, 38 | pg_get_expr(c.relpartbound, c.oid, true) AS partitioning_values, 39 | pg_get_expr(p.partexprs, c.oid, true) AS sub_partitioning_values 40 | FROM inheritance_tree it 41 | JOIN pg_class c ON c.oid = it.table_oid 42 | LEFT JOIN pg_partitioned_table p ON p.partrelid = it.table_oid 43 | ORDER BY it.table_name, c.reltuples; -------------------------------------------------------------------------------- /14/docker-postgres/sql/vw_who.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.state, 5 | now() - pa.xact_start AS ts_age, 6 | clock_timestamp() - pa.xact_start AS xact_age, 7 | clock_timestamp() - pa.query_start AS query_age, 8 | clock_timestamp() - pa.state_change AS change_age, 9 | pa.datname, 10 | pa.usename, 11 | pa.wait_event_type, 12 | pa.wait_event, 13 | pa.client_addr, 14 | pa.client_port, 15 | pa.application_name, 16 | pa.backend_type, 17 | pa.query 18 | FROM pg_stat_activity pa 19 | WHERE pa.pid <> pg_backend_pid() 20 | ORDER BY pa.datname, pa.state, pa.xact_start; 21 | -------------------------------------------------------------------------------- /14/docker-postgres/sql/vw_who_13plus.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.leader_pid, 5 | pa.state, 6 | now() - pa.xact_start AS ts_age, 7 | clock_timestamp() - pa.xact_start AS xact_age, 8 | clock_timestamp() - pa.query_start AS query_age, 9 | clock_timestamp() - pa.state_change AS change_age, 10 | pa.datname, 11 | pa.usename, 12 | pa.wait_event_type, 13 | pa.wait_event, 14 | pa.client_addr, 15 | pa.client_port, 16 | pa.application_name, 17 | pa.backend_type, 18 | pa.query 19 | FROM pg_stat_activity pa 20 | WHERE pa.pid <> pg_backend_pid() 21 | ORDER BY pa.datname, pa.state, pa.xact_start, pa.leader_pid NULLS FIRST; 22 | -------------------------------------------------------------------------------- /14/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/14_1 /usr/share/postgres/14_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/14_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/14_1 /usr/share/postgres/14_1/tsearch_data 5 | # стартуем докер 6 | docker run --rm --name my_postgres_14 --shm-size 2147483648 -p 5433:5432/tcp --stop-timeout 60 \ 7 | -v /var/lib/pgsql/14_1/data:/var/lib/postgresql/data \ 8 | -v /var/log/postgresql1:/var/log/postgresql \ 9 | -v /mnt/pgbak2/:/mnt/pgbak \ 10 | -v /usr/share/postgres/14_1/tsearch_data:/usr/share/postgresql/tsearch_data \ 11 | -e POSTGRES_PASSWORD=postgres -e POSTGRES_HOST_AUTH_METHOD=trust -e DEPLOY_PASSWORD=postgres -e PGBOUNCER_PASSWORD=postgres -e TZ="Etc/UTC" \ 12 | grufos/postgres:14.11 \ 13 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" -c shared_ispell.max_size=70MB 14 | -------------------------------------------------------------------------------- /14/postgres-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | postgres: 5 | 6 | # image: grufos/postgres:14.11 7 | build: 8 | context: ./docker-postgres 9 | dockerfile: Dockerfile 10 | stop_grace_period: 60s 11 | shm_size: '2gb' 12 | command: | 13 | -c shared_preload_libraries='plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm' 14 | -c shared_ispell.max_size=70MB 15 | volumes: 16 | - "/var/lib/pgsql/14_1/data:/var/lib/postgresql/data" 17 | - "/var/log/postgresql1:/var/log/postgresql" 18 | - "/mnt/pgbak2/:/mnt/pgbak/" 19 | - "/usr/share/postgres/14_1/tsearch_data:/usr/share/postgresql/tsearch_data" 20 | - "/var/lib/pgsql/14_1/app_db_init_sql:/app_db_init_sql" 21 | ports: 22 | - "5433:5432" 23 | environment: 24 | ENV_DB_VALUE: DEV 25 | APP_DB: "My_db" 26 | APP_DB_PASSWORD: qweasdzxc 27 | # POSTGRES_INITDB_ARGS: "--locale=ru_RU.UTF8 --data-checksums" 28 | POSTGRES_PASSWORD: qweasdzxc 29 | POSTGRES_HOST_AUTH_METHOD: trust 30 | DEPLOY_PASSWORD: qweasdzxc 31 | PGBOUNCER_PASSWORD: zxcasdqwe 32 | # TZ: "Etc/UTC" 33 | TZ: "Europe/Moscow" 34 | EMAILTO: "DBA-PostgreSQL@company.ru" 35 | EMAIL_SERVER: "mail.company.ru" 36 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 37 | BACKUP_THREADS: "4" 38 | BACKUP_MODE: "" 39 | 40 | -------------------------------------------------------------------------------- /14/restore-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprorestore: 5 | build: 6 | context: ./docker-pgprorestore 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/14_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | BACKUP_THREADS: "4" 16 | # восстановление на указанную точку во времени 17 | # TARGET_TIME: "2020-10-22 06:00:00" 18 | # восстановление на указанный срез в архиве 19 | # TARGET_ID: "QILQ45" 20 | # если ни один из этих параметров не указан, то восстановление выполняется на состояние - latest (самое последнее состояние) -------------------------------------------------------------------------------- /14/show_backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup_show: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/mnt/pgbak2/:/mnt/pgbak/" 11 | 12 | environment: 13 | TZ: "Europe/Moscow" 14 | EMAILTO: "DBA-PostgreSQL@company.ru" 15 | EMAIL_SERVER: "mail.company.ru" 16 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 17 | EMAIL_SEND: "no" 18 | 19 | entrypoint: "/usr/local/bin/show.sh" 20 | -------------------------------------------------------------------------------- /15/analyze-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | analyze: 5 | build: 6 | context: ./docker-analyze 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/log/pgbouncer1:/var/log/pgbouncer" 12 | - "/var/log/mamonsu1:/var/log/mamonsu" 13 | 14 | environment: 15 | STAT_STATEMENTS: "true" 16 | # TZ: "Etc/UTC" 17 | TZ: "Europe/Moscow" 18 | PGPASSWORD: qweasdzxc 19 | # PGHOST: 10.10.2.139 20 | PGHOST: postgres 21 | PGPORT: 5432 22 | PGBHOST: pgbouncer 23 | PGBPORT: 6432 24 | -------------------------------------------------------------------------------- /15/backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/15_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | PGHOST: postgres 16 | PGPORT: 5432 17 | # PGUSER: "postgres" 18 | # PGPASSWORD: "qweasdzxc" 19 | EMAILTO: "DBA-PostgreSQL@company.ru" 20 | EMAIL_SERVER: "mail.company.ru" 21 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 22 | BACKUP_THREADS: "4" 23 | BACKUP_MODE: "" 24 | BACKUP_STREAM: "yes" 25 | -------------------------------------------------------------------------------- /15/bin/analyze_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "analyze-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /15/bin/backup_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /15/bin/check_cluster_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "check_cluster_service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /15/bin/clear_all_docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # docker system prune -a # чистка всех образов в каталоге /var/lib/docker/overlay2 3 | docker stop $(docker ps -q) 4 | docker rm -v $(docker ps -aq -f status=exited) 5 | docker rmi $(docker image ls -q) -f 6 | docker rmi $(docker image ls -q) -f 7 | -------------------------------------------------------------------------------- /15/bin/docker_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # получает через пробел имена контейнеров для сборки. Если не указано, то принимается такая строка: 4 | # pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb 5 | # 6 | VERSION=15 7 | 8 | set -euo pipefail 9 | 10 | if [[ $# -ne 0 ]]; then 11 | LISTDOCKER=$@ 12 | else 13 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 14 | fi 15 | 16 | for param in $LISTDOCKER 17 | do 18 | cd docker-$param 19 | dir=`pwd` 20 | echo "" 21 | echo "=====================================" 22 | echo " $dir" 23 | echo "=====================================" 24 | echo "" 25 | docker build --no-cache . -t ${VERSION}_$param:latest 26 | cd .. 27 | done 28 | 29 | docker image ls --all 30 | -------------------------------------------------------------------------------- /15/bin/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker run -p 127.0.0.1:5433:5432/tcp --shm-size 2147483648 \ 3 | -e POSTGRES_PASSWORD=postgres \ 4 | -e POSTGRES_HOST_AUTH_METHOD=trust \ 5 | -e DEPLOY_PASSWORD=postgres \ 6 | -e TZ="Etc/UTC" \ 7 | grufos/postgres:15.6 \ 8 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" \ 9 | -c shared_ispell.max_size=70MB 10 | -------------------------------------------------------------------------------- /15/bin/harbor_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=15 3 | MINOR=6 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | PROJECT=dba_postgres 8 | URL=harbor.company.ru 9 | ACCOUNT="${URL}/${PROJECT}" 10 | LATEST_PUSH='no' 11 | 12 | set -euo pipefail 13 | 14 | if [[ $# -ne 0 ]]; then 15 | LISTDOCKER=$@ 16 | else 17 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 18 | fi 19 | 20 | for param in $LISTDOCKER 21 | do 22 | if [ "$param" = "pgbouncer" ]; then 23 | vers="${VERS_BOUNCER}" 24 | elif [ "$param" = "mamonsu" ]; then 25 | vers="${VERSION}_${VERS_MAMONSU}" 26 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 27 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 28 | else 29 | vers="${VERSION}.${MINOR}" 30 | fi 31 | echo "=======================" 32 | echo "${param} -> ${vers}" 33 | echo "=======================" 34 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 35 | echo " push ..." 36 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 37 | if [ "$LATEST_PUSH" = "yes" ]; then 38 | docker push ${ACCOUNT}/${param}:latest 39 | fi 40 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 41 | docker push ${ACCOUNT}/${param}:${vers} 42 | fi 43 | done 44 | -------------------------------------------------------------------------------- /15/bin/hub_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=15 3 | MINOR=6 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | ACCOUNT=grufos 8 | LATEST_PUSH='no' 9 | 10 | set -euo pipefail 11 | 12 | if [[ $# -ne 0 ]]; then 13 | LISTDOCKER=$@ 14 | else 15 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 16 | fi 17 | 18 | for param in $LISTDOCKER 19 | do 20 | if [ "$param" = "pgbouncer" ]; then 21 | vers="${VERS_BOUNCER}" 22 | elif [ "$param" = "mamonsu" ]; then 23 | vers="${VERSION}_${VERS_MAMONSU}" 24 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 25 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 26 | else 27 | vers="${VERSION}.${MINOR}" 28 | fi 29 | echo "=======================" 30 | echo "${param} -> ${vers}" 31 | echo "=======================" 32 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 33 | echo " push ..." 34 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 35 | if [ "$LATEST_PUSH" = "yes" ]; then 36 | docker push ${ACCOUNT}/${param}:latest 37 | fi 38 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 39 | docker push ${ACCOUNT}/${param}:${vers} 40 | fi 41 | done 42 | -------------------------------------------------------------------------------- /15/bin/postgres_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/postgresql1/* 8 | docker-compose -f "postgres-service.yml" up --build "$@" 9 | -------------------------------------------------------------------------------- /15/bin/postgres_start_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_all.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /15/bin/postgres_start_pgb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_pgb.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /15/bin/restore_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "restore-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /15/bin/show_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "show_backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /15/bin/upgrade_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | SRC="14" 4 | DEST="15" 5 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/mamonsu1 /var/lib/pgsql/${DEST}_1 /usr/share/postgres/${DEST}_1 6 | chown 999:999 /mnt/pgbak2 /var/log/postgresql1 /var/log/mamonsu1 /var/lib/pgsql/${DEST}_1 /usr/share/postgres/${DEST}_1 7 | rm -rf /usr/share/postgres/${DEST}_1/* 8 | rm -rf /var/lib/pgsql/${DEST}_1/* 9 | mkdir -p /var/lib/pgsql/${DEST}_1/${DEST} /var/lib/pgsql/${DEST}_1/$SRC /usr/share/postgres/${DEST}_1/tsearch_data 10 | chown 999:999 /var/lib/pgsql/${DEST}_1/${DEST} /var/lib/pgsql/${DEST}_1/$SRC /usr/share/postgres/${DEST}_1/tsearch_data 11 | cp -rpf /var/lib/pgsql/${SRC}_1/* /var/lib/pgsql/${DEST}_1/$SRC 12 | clear 13 | # запускаем сборку 14 | docker-compose -f "postgres-pgupgrade.yml" up --build "$@" 15 | -------------------------------------------------------------------------------- /15/check_cluster_service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprocheckdb: 5 | build: 6 | context: ./docker-pgprocheckdb 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/lib/pgsql/15_1/data:/var/lib/postgresql/data" 12 | - "/mnt/pgbak2/:/mnt/pgbak/" 13 | 14 | environment: 15 | TZ: "Europe/Moscow" 16 | EMAILTO: "DBA-PostgreSQL@company.ru" 17 | EMAIL_SERVER: "mail.company.ru" 18 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 19 | EMAIL_SEND: "no" 20 | PGHOST: "postgres" 21 | PGPORT: "5432" 22 | PGUSER: "postgres" 23 | PGPASSWORD: "qweasdzxc" 24 | BACKUP_THREADS: "4" 25 | AMCHECK: "true" 26 | HEAPALLINDEXED: "true" 27 | 28 | -------------------------------------------------------------------------------- /15/docker-analyze/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 15 10 | ENV BACKUP_PATH /mnt/pgbak 11 | 12 | # explicitly set user/group IDs 13 | RUN set -eux; \ 14 | groupadd -r postgres --gid=999; \ 15 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 16 | mkdir -p /var/lib/postgresql/data; 17 | 18 | RUN apt-get update \ 19 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail bzip2 pgbadger \ 20 | # ... install psql ... 21 | && echo "deb http://apt.postgresql.org/pub/repos/apt $DEBIAN_RELEASE-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 22 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 23 | && apt-get update \ 24 | && apt-get install -y --no-install-recommends postgresql-client-$PG_MAJOR \ 25 | # ... create dirs ... 26 | && mkdir -p /var/log/postgresql/report \ 27 | && mkdir -p /var/log/pgbouncer \ 28 | && mkdir -p /var/log/mamonsu \ 29 | # ... cleaning ... 30 | && apt-get purge -y make gcc gcc-12 cpp cpp-12 clang* golang* postgresql-server-dev-$PG_MAJOR *-dev *-man \ 31 | && apt-get -f install \ 32 | && apt-get -y autoremove \ 33 | && apt-get -y clean \ 34 | && apt-get -y autoclean \ 35 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 36 | 37 | COPY ./analyze_log.sh /usr/local/bin 38 | COPY ./pg_stat_statements_report.sql /var/lib/postgresql 39 | 40 | RUN chown postgres:postgres /var/lib/postgresql/*.sql \ 41 | && chown -R postgres:postgres /var/log/postgresql/report \ 42 | && chown -R postgres:postgres /var/log/pgbouncer \ 43 | && chown -R postgres:postgres /var/log/mamonsu \ 44 | && chmod +x /usr/local/bin/*.sh 45 | 46 | USER postgres 47 | ENTRYPOINT [ "/usr/local/bin/analyze_log.sh" ] 48 | -------------------------------------------------------------------------------- /15/docker-mamonsu/bootstrap_post.sql: -------------------------------------------------------------------------------- 1 | select 'GRANT EXECUTE ON FUNCTION mamonsu.' || oid::regprocedure || ' TO mamonsu;' from pg_proc where pronamespace = 'mamonsu'::regnamespace \gexec 2 | -------------------------------------------------------------------------------- /15/docker-mamonsu/mamonsu_right_add.sql: -------------------------------------------------------------------------------- 1 | select not pg_is_in_recovery() as is_master \gset 2 | \if :is_master 3 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 4 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 5 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 6 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 7 | select current_database() = 'mamonsu' as is_mamonsu_db \gset 8 | \if :is_mamonsu_db 9 | select '''' || case when current_setting('shared_buffers') like '%GB' 10 | then (replace(current_setting('shared_buffers'), 'GB', '')::int)*1024 11 | else replace(current_setting('shared_buffers'), 'MB', '')::int 12 | end * 0.0117 || ' MB''' as highpage_mb \gset 13 | ALTER FUNCTION mamonsu.buffer_cache() SET WORK_MEM = :highpage_mb; -- for shared_buffers 16 Гб 200 Мб 14 | GRANT USAGE ON SCHEMA public TO mamonsu; 15 | GRANT EXECUTE ON FUNCTION public.pg_stat_statements(boolean) TO mamonsu; 16 | \endif 17 | -- we give the right to connect for the role of mamonsu 18 | do $$ begin execute 'GRANT CONNECT ON DATABASE "' || current_database() || '" TO mamonsu; '; end $$; 19 | -- 20 | CREATE SCHEMA IF NOT EXISTS pgbouncer; 21 | GRANT CONNECT ON DATABASE mamonsu TO pgbouncer; 22 | GRANT USAGE ON SCHEMA pgbouncer TO pgbouncer; 23 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 24 | LANGUAGE plpgsql SECURITY DEFINER 25 | AS $$ 26 | BEGIN 27 | SELECT usename, passwd FROM pg_catalog.pg_shadow 28 | WHERE usename = p_username INTO uname, phash; 29 | RETURN; 30 | END; 31 | $$; 32 | \endif 33 | -------------------------------------------------------------------------------- /15/docker-mamonsu/pre.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not pg_is_in_recovery() as is_master \gset 6 | \if :is_master 7 | select not exists(select true FROM pg_catalog.pg_database where datname='mamonsu') as is_db_mamonsu \gset 8 | \if :is_db_mamonsu 9 | CREATE DATABASE mamonsu; 10 | \endif 11 | \c mamonsu 12 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 13 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 14 | -- check role mamonsu ... 15 | select not exists(select * from pg_roles where rolname = 'mamonsu') as is_role_mamonsu \gset 16 | \if :is_role_mamonsu 17 | select :'MAMONSU_PASSWORD' = '' as is_mamonsu_password_exists \gset 18 | \if :is_mamonsu_password_exists 19 | CREATE ROLE mamonsu LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 20 | \else 21 | CREATE ROLE mamonsu LOGIN PASSWORD :'MAMONSU_PASSWORD' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 22 | \endif 23 | \else 24 | select :'MAMONSU_PASSWORD' <> '' as is_mamonsu_password_notexists \gset 25 | \if :is_mamonsu_password_notexists 26 | ALTER ROLE mamonsu WITH PASSWORD :'MAMONSU_PASSWORD' ; 27 | \endif 28 | \endif 29 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 30 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 31 | \endif 32 | 33 | -- get list all current DBs 34 | select string_agg(datname,' ') from pg_catalog.pg_database where not datistemplate; 35 | -------------------------------------------------------------------------------- /15/docker-pgprobackup/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /15/docker-pgprobackup/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /15/docker-pgprocheckdb/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /15/docker-pgprocheckdb/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /15/docker-pgprorestore/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 15 10 | ENV PGDATA /var/lib/postgresql/data 11 | ENV BACKUP_PATH /mnt/pgbak 12 | 13 | # explicitly set user/group IDs 14 | RUN set -eux; \ 15 | groupadd -r postgres --gid=999; \ 16 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 17 | mkdir -p /var/lib/postgresql/data; \ 18 | chown -R postgres:postgres /var/lib/postgresql 19 | 20 | RUN apt-get update \ 21 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail jq \ 22 | # подключаем репозитарий сообщества PostgreSQL 23 | && echo "deb http://apt.postgresql.org/pub/repos/apt ${DEBIAN_RELEASE}-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 24 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 25 | # подключаем репозитарий архивной утилиты 26 | && echo "deb [arch=amd64] https://repo.postgrespro.ru/pg_probackup/deb/ $DEBIAN_RELEASE main-$DEBIAN_RELEASE" > /etc/apt/sources.list.d/pg_probackup.list \ 27 | && wget -qO - https://repo.postgrespro.ru/pg_probackup/keys/GPG-KEY-PG-PROBACKUP | tee /etc/apt/trusted.gpg.d/pg_probackup.asc \ 28 | # ... updating ... 29 | && apt-get update \ 30 | && apt-get install -y --no-install-recommends \ 31 | pg-probackup-$PG_MAJOR \ 32 | && mkdir -p $BACKUP_PATH \ 33 | && chown -R postgres:postgres $BACKUP_PATH \ 34 | # ... cleaning ... 35 | && apt-get purge -y make gcc gcc-12 cpp cpp-12 clang* golang* postgresql-server-dev-$PG_MAJOR *-dev *-man \ 36 | && apt-get -f install \ 37 | && apt-get -y autoremove \ 38 | && apt-get -y clean \ 39 | && apt-get -y autoclean \ 40 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 41 | 42 | COPY ./restore.sh /usr/local/bin 43 | COPY ./show.sh /usr/local/bin 44 | 45 | RUN chmod +x /usr/local/bin/*.sh 46 | 47 | ENTRYPOINT [ "/usr/local/bin/restore.sh" ] 48 | -------------------------------------------------------------------------------- /15/docker-pgprorestore/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$1" != "" ]; then 24 | EMAIL_SEND=$1 25 | fi 26 | 27 | if [ "$2" != "" ]; then 28 | EMAILTO="$2" 29 | fi 30 | 31 | if [ "$BACKUP_PATH" = "" ]; then 32 | BACKUP_PATH="/mnt/pgbak" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /15/docker-pgupgrade/pg_ident.conf: -------------------------------------------------------------------------------- 1 | # PostgreSQL User Name Maps 2 | # ========================= 3 | # 4 | # Refer to the PostgreSQL documentation, chapter "Client 5 | # Authentication" for a complete description. A short synopsis 6 | # follows. 7 | # 8 | # This file controls PostgreSQL user name mapping. It maps external 9 | # user names to their corresponding PostgreSQL user names. Records 10 | # are of the form: 11 | # 12 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 13 | # 14 | # (The uppercase quantities must be replaced by actual values.) 15 | # 16 | # MAPNAME is the (otherwise freely chosen) map name that was used in 17 | # pg_hba.conf. SYSTEM-USERNAME is the detected user name of the 18 | # client. PG-USERNAME is the requested PostgreSQL user name. The 19 | # existence of a record specifies that SYSTEM-USERNAME may connect as 20 | # PG-USERNAME. 21 | # 22 | # If SYSTEM-USERNAME starts with a slash (/), it will be treated as a 23 | # regular expression. Optionally this can contain a capture (a 24 | # parenthesized subexpression). The substring matching the capture 25 | # will be substituted for \1 (backslash-one) if present in 26 | # PG-USERNAME. 27 | # 28 | # Multiple maps may be specified in this file and used by pg_hba.conf. 29 | # 30 | # No map names are defined in the default configuration. If all 31 | # system user names and PostgreSQL user names are the same, you don't 32 | # need anything in this file. 33 | # 34 | # This file is read on server startup and when the postmaster receives 35 | # a SIGHUP signal. If you edit the file on a running system, you have 36 | # to SIGHUP the postmaster for the changes to take effect. You can 37 | # use "pg_ctl reload" to do that. 38 | 39 | # Put your actual configuration here 40 | # ---------------------------------- 41 | 42 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 43 | main postgres backup -------------------------------------------------------------------------------- /15/docker-postgres/locales.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | date format = %Y-%m-%d %H:%M:%S.%z 3 | 4 | [en_US] 5 | date format = %Y-%m-%d %H:%M:%S.%z 6 | language = us_english 7 | charset = iso_1 8 | -------------------------------------------------------------------------------- /15/docker-postgres/pg_ident.conf: -------------------------------------------------------------------------------- 1 | # PostgreSQL User Name Maps 2 | # ========================= 3 | # 4 | # Refer to the PostgreSQL documentation, chapter "Client 5 | # Authentication" for a complete description. A short synopsis 6 | # follows. 7 | # 8 | # This file controls PostgreSQL user name mapping. It maps external 9 | # user names to their corresponding PostgreSQL user names. Records 10 | # are of the form: 11 | # 12 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 13 | # 14 | # (The uppercase quantities must be replaced by actual values.) 15 | # 16 | # MAPNAME is the (otherwise freely chosen) map name that was used in 17 | # pg_hba.conf. SYSTEM-USERNAME is the detected user name of the 18 | # client. PG-USERNAME is the requested PostgreSQL user name. The 19 | # existence of a record specifies that SYSTEM-USERNAME may connect as 20 | # PG-USERNAME. 21 | # 22 | # If SYSTEM-USERNAME starts with a slash (/), it will be treated as a 23 | # regular expression. Optionally this can contain a capture (a 24 | # parenthesized subexpression). The substring matching the capture 25 | # will be substituted for \1 (backslash-one) if present in 26 | # PG-USERNAME. 27 | # 28 | # Multiple maps may be specified in this file and used by pg_hba.conf. 29 | # 30 | # No map names are defined in the default configuration. If all 31 | # system user names and PostgreSQL user names are the same, you don't 32 | # need anything in this file. 33 | # 34 | # This file is read on server startup and when the postmaster receives 35 | # a SIGHUP signal. If you edit the file on a running system, you have 36 | # to SIGHUP the postmaster for the changes to take effect. You can 37 | # use "pg_ctl reload" to do that. 38 | 39 | # Put your actual configuration here 40 | # ---------------------------------- 41 | 42 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 43 | main postgres backup -------------------------------------------------------------------------------- /15/docker-postgres/postgres: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # this is start file for postgres 4 | 5 | # Check on the need to initialize the catalog of the FTS 6 | tar -xzkf /usr/share/postgresql/$PG_MAJOR/tsearch_data.tar.gz -C /usr/share/postgresql/tsearch_data/ > /dev/null 2>&1 7 | 8 | # start postgres process ... 9 | exec /usr/lib/postgresql/$PG_MAJOR/bin/postgres ${@} 10 | -------------------------------------------------------------------------------- /15/docker-postgres/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /15/docker-postgres/sql/background_start.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.background_start(p_command text) RETURNS void 2 | LANGUAGE plpgsql 3 | AS $$ 4 | /* 5 | Запускает указанную команду отдельным фоновым процессом без ожидания возврата результата 6 | */ 7 | declare v_pid integer = pg_background_launch(p_command); 8 | begin 9 | perform pg_sleep(0.1); 10 | perform pg_background_detach(v_pid); 11 | end; 12 | $$; -------------------------------------------------------------------------------- /15/docker-postgres/sql/db_target.sql: -------------------------------------------------------------------------------- 1 | -- 2 | -- code only for the target (additionally specified) database 3 | -- 4 | 5 | SET default_transaction_read_only = off; 6 | SET client_encoding = 'UTF8'; 7 | SET standard_conforming_strings = on; 8 | 9 | select current_database() as dbconnect \gset 10 | select rolname as role_deploy from pg_roles where rolname ilike '%deploy%' limit 1 \gset 11 | 12 | ALTER DATABASE :"dbconnect" OWNER TO :"role_deploy"; 13 | GRANT ALL ON DATABASE :"dbconnect" TO :"role_deploy"; 14 | ALTER DATABASE :"dbconnect" SET search_path = :DEV_SCHEMA, public, tiger; 15 | -------------------------------------------------------------------------------- /15/docker-postgres/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /15/docker-postgres/sql/post_warning.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not (setting ~ 'shared_ispell') as is_shared_ispell_notloaded from pg_settings where name ~ 'shared_preload_libraries' \gset 6 | \if :is_shared_ispell_notloaded 7 | \echo "" 8 | \echo "-- ================================================================================================================ --" 9 | \echo "Please, after the 1st start of the container with an empty database directory, сorrect in the postgreSQL.conf file," 10 | \echo "the 'shared_preload_libraries' parameter it must include the download of the 'shared_ispell' library " 11 | \echo "and re-run the script: update-extension.sh" 12 | \echo "-- ================================================================================================================ --" 13 | \endif 14 | -------------------------------------------------------------------------------- /15/docker-postgres/sql/replace_char_xml.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.replace_char_xml(p_str2xml text) RETURNS text 2 | LANGUAGE sql IMMUTABLE PARALLEL SAFE COST 10.0 3 | AS $$ 4 | select replace(replace(replace(replace(replace(p_str2xml,'&','&'),'''','''),'"','"'),'<','<'),'>','>'); 5 | $$; 6 | -------------------------------------------------------------------------------- /15/docker-postgres/sql/user_lookup.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 2 | LANGUAGE plpgsql SECURITY DEFINER 3 | AS $$ 4 | BEGIN 5 | SELECT usename, passwd FROM pg_catalog.pg_shadow 6 | WHERE usename = p_username INTO uname, phash; 7 | RETURN; 8 | END; 9 | $$; 10 | -------------------------------------------------------------------------------- /15/docker-postgres/sql/vw_locks.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_locks AS 2 | SELECT pg_locks.pid, 3 | pg_locks.virtualtransaction AS vxid, 4 | pg_locks.locktype AS lock_type, 5 | pg_locks.mode AS lock_mode, 6 | pg_locks.granted, 7 | CASE 8 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 9 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 10 | ELSE pg_locks.transactionid::text 11 | END AS xid_lock, 12 | pg_class.relname, 13 | pg_locks.page, 14 | pg_locks.tuple, 15 | pg_locks.classid, 16 | pg_locks.objid, 17 | pg_locks.objsubid 18 | FROM pg_locks 19 | LEFT JOIN pg_class ON pg_locks.relation = pg_class.oid 20 | WHERE pg_locks.pid <> pg_backend_pid() AND pg_locks.virtualtransaction IS DISTINCT FROM pg_locks.virtualxid 21 | ORDER BY pg_locks.pid, pg_locks.virtualtransaction, pg_locks.granted DESC, ( 22 | CASE 23 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 24 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 25 | ELSE pg_locks.transactionid::text 26 | END), pg_locks.locktype, pg_locks.mode, pg_class.relname; 27 | -------------------------------------------------------------------------------- /15/docker-postgres/sql/vw_partitions.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_partitions AS 2 | WITH RECURSIVE inheritance_tree AS ( 3 | SELECT c_1.oid AS table_oid, 4 | n.nspname AS table_schema, 5 | c_1.relname AS table_name, 6 | NULL::name AS table_parent_schema, 7 | NULL::name AS table_parent_name, 8 | c_1.relispartition AS is_partition 9 | FROM pg_class c_1 10 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 11 | WHERE c_1.relkind = 'p'::"char" AND c_1.relispartition = false 12 | UNION ALL 13 | SELECT inh.inhrelid AS table_oid, 14 | n.nspname AS table_schema, 15 | c_1.relname AS table_name, 16 | nn.nspname AS table_parent_schema, 17 | cc.relname AS table_parent_name, 18 | c_1.relispartition AS is_partition 19 | FROM inheritance_tree it_1 20 | JOIN pg_inherits inh ON inh.inhparent = it_1.table_oid 21 | JOIN pg_class c_1 ON inh.inhrelid = c_1.oid 22 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 23 | JOIN pg_class cc ON it_1.table_oid = cc.oid 24 | JOIN pg_namespace nn ON nn.oid = cc.relnamespace 25 | ) 26 | SELECT it.table_schema, 27 | it.table_name, 28 | c.reltuples, 29 | c.relpages, 30 | CASE p.partstrat 31 | WHEN 'l'::"char" THEN 'BY LIST'::text 32 | WHEN 'r'::"char" THEN 'BY RANGE'::text 33 | WHEN 'h'::"char" THEN 'BY HASH'::text 34 | ELSE 'not partitioned'::text 35 | END AS partitionin_type, 36 | it.table_parent_schema, 37 | it.table_parent_name, 38 | pg_get_expr(c.relpartbound, c.oid, true) AS partitioning_values, 39 | pg_get_expr(p.partexprs, c.oid, true) AS sub_partitioning_values 40 | FROM inheritance_tree it 41 | JOIN pg_class c ON c.oid = it.table_oid 42 | LEFT JOIN pg_partitioned_table p ON p.partrelid = it.table_oid 43 | ORDER BY it.table_name, c.reltuples; -------------------------------------------------------------------------------- /15/docker-postgres/sql/vw_who.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.state, 5 | now() - pa.xact_start AS ts_age, 6 | clock_timestamp() - pa.xact_start AS xact_age, 7 | clock_timestamp() - pa.query_start AS query_age, 8 | clock_timestamp() - pa.state_change AS change_age, 9 | pa.datname, 10 | pa.usename, 11 | pa.wait_event_type, 12 | pa.wait_event, 13 | pa.client_addr, 14 | pa.client_port, 15 | pa.application_name, 16 | pa.backend_type, 17 | pa.query 18 | FROM pg_stat_activity pa 19 | WHERE pa.pid <> pg_backend_pid() 20 | ORDER BY pa.datname, pa.state, pa.xact_start; 21 | -------------------------------------------------------------------------------- /15/docker-postgres/sql/vw_who_13plus.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.leader_pid, 5 | pa.state, 6 | now() - pa.xact_start AS ts_age, 7 | clock_timestamp() - pa.xact_start AS xact_age, 8 | clock_timestamp() - pa.query_start AS query_age, 9 | clock_timestamp() - pa.state_change AS change_age, 10 | pa.datname, 11 | pa.usename, 12 | pa.wait_event_type, 13 | pa.wait_event, 14 | pa.client_addr, 15 | pa.client_port, 16 | pa.application_name, 17 | pa.backend_type, 18 | pa.query 19 | FROM pg_stat_activity pa 20 | WHERE pa.pid <> pg_backend_pid() 21 | ORDER BY pa.datname, pa.state, pa.xact_start, pa.leader_pid NULLS FIRST; 22 | -------------------------------------------------------------------------------- /15/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/15_1 /usr/share/postgres/15_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/15_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/15_1 /usr/share/postgres/15_1/tsearch_data 5 | # стартуем докер 6 | docker run --rm --name my_postgres_15 --shm-size 2147483648 -p 5433:5432/tcp --stop-timeout 60 \ 7 | -v /var/lib/pgsql/15_1/data:/var/lib/postgresql/data \ 8 | -v /var/log/postgresql1:/var/log/postgresql \ 9 | -v /mnt/pgbak2/:/mnt/pgbak \ 10 | -v /usr/share/postgres/15_1/tsearch_data:/usr/share/postgresql/tsearch_data \ 11 | -e POSTGRES_PASSWORD=postgres -e POSTGRES_HOST_AUTH_METHOD=trust -e DEPLOY_PASSWORD=postgres -e PGBOUNCER_PASSWORD=postgres -e TZ="Etc/UTC" \ 12 | grufos/postgres:15.6 \ 13 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" -c shared_ispell.max_size=70MB 14 | -------------------------------------------------------------------------------- /15/postgres-pgupgrade.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgupgrade: 5 | 6 | # image: grufos/pgupgrade:15.6 7 | build: 8 | context: ./docker-pgupgrade 9 | dockerfile: Dockerfile 10 | stop_grace_period: 60s 11 | shm_size: '2gb' 12 | volumes: 13 | - "/var/lib/pgsql/15_1:/var/lib/postgresql" 14 | - "/var/log/postgresql1:/var/log/postgresql" 15 | - "/usr/share/postgres/14_1/tsearch_data:/usr/share/postgresql/14/tsearch_data" 16 | - "/usr/share/postgres/15_1/tsearch_data:/usr/share/postgresql/15/tsearch_data" 17 | environment: 18 | PGDATACOPY_MODE: HardLink 19 | -------------------------------------------------------------------------------- /15/postgres-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | postgres: 5 | 6 | # image: grufos/postgres:15.6 7 | build: 8 | context: ./docker-postgres 9 | dockerfile: Dockerfile 10 | stop_grace_period: 60s 11 | shm_size: '2gb' 12 | command: | 13 | -c shared_preload_libraries='plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm' 14 | -c shared_ispell.max_size=70MB 15 | volumes: 16 | - "/var/lib/pgsql/15_1/data:/var/lib/postgresql/data" 17 | - "/var/log/postgresql1:/var/log/postgresql" 18 | - "/mnt/pgbak2/:/mnt/pgbak/" 19 | - "/usr/share/postgres/15_1/tsearch_data:/usr/share/postgresql/tsearch_data" 20 | - "/var/lib/pgsql/15_1/app_db_init_sql:/app_db_init_sql" 21 | ports: 22 | - "5433:5432" 23 | environment: 24 | ENV_DB_VALUE: DEV 25 | APP_DB: "My_db" 26 | APP_DB_PASSWORD: qweasdzxc 27 | # POSTGRES_INITDB_ARGS: "--locale=ru_RU.UTF8 --data-checksums" 28 | POSTGRES_PASSWORD: qweasdzxc 29 | POSTGRES_HOST_AUTH_METHOD: trust 30 | DEPLOY_PASSWORD: qweasdzxc 31 | PGBOUNCER_PASSWORD: zxcasdqwe 32 | # TZ: "Etc/UTC" 33 | TZ: "Europe/Moscow" 34 | EMAILTO: "DBA-PostgreSQL@company.ru" 35 | EMAIL_SERVER: "mail.company.ru" 36 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 37 | BACKUP_THREADS: "4" 38 | BACKUP_MODE: "" 39 | 40 | -------------------------------------------------------------------------------- /15/restore-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprorestore: 5 | build: 6 | context: ./docker-pgprorestore 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/15_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | BACKUP_THREADS: "4" 16 | # восстановление на указанную точку во времени 17 | # TARGET_TIME: "2020-10-22 06:00:00" 18 | # восстановление на указанный срез в архиве 19 | # TARGET_ID: "QILQ45" 20 | # если ни один из этих параметров не указан, то восстановление выполняется на состояние - latest (самое последнее состояние) -------------------------------------------------------------------------------- /15/show_backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup_show: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/mnt/pgbak2/:/mnt/pgbak/" 11 | 12 | environment: 13 | TZ: "Europe/Moscow" 14 | EMAILTO: "DBA-PostgreSQL@company.ru" 15 | EMAIL_SERVER: "mail.company.ru" 16 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 17 | EMAIL_SEND: "no" 18 | 19 | entrypoint: "/usr/local/bin/show.sh" 20 | -------------------------------------------------------------------------------- /15/upgrade_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker run --rm --name upgrade-db --shm-size 2147483648 \ 3 | -v /var/lib/pgsql/15_1:/var/lib/postgresql \ 4 | -v /var/log/postgresql1:/var/log/postgresql \ 5 | -v /usr/share/postgres/14/tsearch_data:/usr/share/postgresql/14/tsearch_data \ 6 | -v /usr/share/postgres/15/tsearch_data:/usr/share/postgresql/15/tsearch_data \ 7 | -e PGDATACOPY_MODE=HardLink \ 8 | 15_pgupgrade 9 | -------------------------------------------------------------------------------- /16/analyze-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | analyze: 5 | build: 6 | context: ./docker-analyze 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/log/pgbouncer1:/var/log/pgbouncer" 12 | - "/var/log/mamonsu1:/var/log/mamonsu" 13 | 14 | environment: 15 | STAT_STATEMENTS: "true" 16 | # TZ: "Etc/UTC" 17 | TZ: "Europe/Moscow" 18 | PGPASSWORD: qweasdzxc 19 | # PGHOST: 10.10.2.139 20 | PGHOST: postgres 21 | PGPORT: 5432 22 | PGBHOST: pgbouncer 23 | PGBPORT: 6432 24 | -------------------------------------------------------------------------------- /16/backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/16_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | PGHOST: postgres 16 | PGPORT: 5432 17 | # PGUSER: "postgres" 18 | # PGPASSWORD: "qweasdzxc" 19 | EMAILTO: "DBA-PostgreSQL@company.ru" 20 | EMAIL_SERVER: "mail.company.ru" 21 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 22 | BACKUP_THREADS: "4" 23 | BACKUP_MODE: "" 24 | BACKUP_STREAM: "yes" 25 | -------------------------------------------------------------------------------- /16/bin/analyze_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "analyze-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /16/bin/backup_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /16/bin/check_cluster_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "check_cluster_service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /16/bin/clear_all_docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # docker system prune -a # чистка всех образов в каталоге /var/lib/docker/overlay2 3 | docker stop $(docker ps -q) 4 | docker rm -v $(docker ps -aq -f status=exited) 5 | docker rmi $(docker image ls -q) -f 6 | docker rmi $(docker image ls -q) -f 7 | -------------------------------------------------------------------------------- /16/bin/docker_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # получает через пробел имена контейнеров для сборки. Если не указано, то принимается такая строка: 4 | # pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb 5 | # 6 | VERSION=16 7 | 8 | set -euo pipefail 9 | 10 | if [[ $# -ne 0 ]]; then 11 | LISTDOCKER=$@ 12 | else 13 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 14 | fi 15 | 16 | for param in $LISTDOCKER 17 | do 18 | cd docker-$param 19 | dir=`pwd` 20 | echo "" 21 | echo "=====================================" 22 | echo " $dir" 23 | echo "=====================================" 24 | echo "" 25 | docker build --no-cache . -t ${VERSION}_$param:latest 26 | cd .. 27 | done 28 | 29 | docker image ls --all 30 | -------------------------------------------------------------------------------- /16/bin/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker run -p 127.0.0.1:5433:5432/tcp --shm-size 2147483648 \ 3 | -e POSTGRES_PASSWORD=postgres \ 4 | -e POSTGRES_HOST_AUTH_METHOD=trust \ 5 | -e DEPLOY_PASSWORD=postgres \ 6 | -e TZ="Etc/UTC" \ 7 | grufos/postgres:16.2 \ 8 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" \ 9 | -c shared_ispell.max_size=70MB 10 | -------------------------------------------------------------------------------- /16/bin/harbor_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=16 3 | MINOR=2 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | PROJECT=dba_postgres 8 | URL=harbor.company.ru 9 | ACCOUNT="${URL}/${PROJECT}" 10 | LATEST_PUSH='yes' 11 | 12 | set -euo pipefail 13 | 14 | if [[ $# -ne 0 ]]; then 15 | LISTDOCKER=$@ 16 | else 17 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 18 | fi 19 | 20 | for param in $LISTDOCKER 21 | do 22 | if [ "$param" = "pgbouncer" ]; then 23 | vers="${VERS_BOUNCER}" 24 | elif [ "$param" = "mamonsu" ]; then 25 | vers="${VERSION}_${VERS_MAMONSU}" 26 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 27 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 28 | else 29 | vers="${VERSION}.${MINOR}" 30 | fi 31 | echo "=======================" 32 | echo "${param} -> ${vers}" 33 | echo "=======================" 34 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 35 | echo " push ..." 36 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 37 | if [ "$LATEST_PUSH" = "yes" ]; then 38 | docker push ${ACCOUNT}/${param}:latest 39 | fi 40 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 41 | docker push ${ACCOUNT}/${param}:${vers} 42 | fi 43 | done 44 | -------------------------------------------------------------------------------- /16/bin/hub_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=16 3 | MINOR=2 4 | VERS_BOUNCER="1.22.0" 5 | VERS_PROBACKUP="2.5.13" 6 | VERS_MAMONSU="3.5.5" 7 | ACCOUNT=grufos 8 | LATEST_PUSH='yes' 9 | 10 | set -euo pipefail 11 | 12 | if [[ $# -ne 0 ]]; then 13 | LISTDOCKER=$@ 14 | else 15 | LISTDOCKER="pgbouncer postgres pgupgrade analyze mamonsu pgprobackup pgprorestore pgprocheckdb" 16 | fi 17 | 18 | for param in $LISTDOCKER 19 | do 20 | if [ "$param" = "pgbouncer" ]; then 21 | vers="${VERS_BOUNCER}" 22 | elif [ "$param" = "mamonsu" ]; then 23 | vers="${VERSION}_${VERS_MAMONSU}" 24 | elif [[ "$param" = "pgprobackup" || $param = "pgprorestore" || $param = "pgprocheckdb" ]]; then 25 | vers="${VERSION}.${MINOR}_${VERS_PROBACKUP}" 26 | else 27 | vers="${VERSION}.${MINOR}" 28 | fi 29 | echo "=======================" 30 | echo "${param} -> ${vers}" 31 | echo "=======================" 32 | if ! docker image ls | grep "${ACCOUNT}/${param}" ; then 33 | echo " push ..." 34 | docker tag ${VERSION}_${param}:latest ${ACCOUNT}/${param}:latest 35 | if [ "$LATEST_PUSH" = "yes" ]; then 36 | docker push ${ACCOUNT}/${param}:latest 37 | fi 38 | docker tag ${ACCOUNT}/${param}:latest ${ACCOUNT}/${param}:${vers} 39 | docker push ${ACCOUNT}/${param}:${vers} 40 | fi 41 | done 42 | -------------------------------------------------------------------------------- /16/bin/postgres_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/postgresql1/* 8 | docker-compose -f "postgres-service.yml" up --build "$@" 9 | -------------------------------------------------------------------------------- /16/bin/postgres_start_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_all.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /16/bin/postgres_start_pgb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | rm -rf /var/log/pgbouncer1/* 8 | rm -rf /var/log/postgresql1/* 9 | rm -rf /var/log/mamonsu1/* 10 | rm -rf /etc/pgbouncer1/* 11 | docker-compose -f "postgres-service_pgb.yml" up --build "$@" 12 | -------------------------------------------------------------------------------- /16/bin/restore_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "restore-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /16/bin/show_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | clear 6 | # запускаем сборку 7 | docker-compose -f "show_backup-service.yml" up --build "$@" 8 | -------------------------------------------------------------------------------- /16/bin/upgrade_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | SRC="15" 4 | DEST="16" 5 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/mamonsu1 /var/lib/pgsql/${DEST}_1 /usr/share/postgres/${DEST}_1 6 | chown 999:999 /mnt/pgbak2 /var/log/postgresql1 /var/log/mamonsu1 /var/lib/pgsql/${DEST}_1 /usr/share/postgres/${DEST}_1 7 | rm -rf /usr/share/postgres/${DEST}_1/* 8 | rm -rf /var/lib/pgsql/${DEST}_1/* 9 | mkdir -p /var/lib/pgsql/${DEST}_1/${DEST} /var/lib/pgsql/${DEST}_1/$SRC /usr/share/postgres/${DEST}_1/tsearch_data 10 | chown 999:999 /var/lib/pgsql/${DEST}_1/${DEST} /var/lib/pgsql/${DEST}_1/$SRC /usr/share/postgres/${DEST}_1/tsearch_data 11 | cp -rpf /var/lib/pgsql/${SRC}_1/* /var/lib/pgsql/${DEST}_1/$SRC 12 | clear 13 | # запускаем сборку 14 | docker-compose -f "postgres-pgupgrade.yml" up --build "$@" 15 | -------------------------------------------------------------------------------- /16/check_cluster_service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprocheckdb: 5 | build: 6 | context: ./docker-pgprocheckdb 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/log/postgresql1:/var/log/postgresql" 11 | - "/var/lib/pgsql/16_1/data:/var/lib/postgresql/data" 12 | - "/mnt/pgbak2/:/mnt/pgbak/" 13 | 14 | environment: 15 | TZ: "Europe/Moscow" 16 | EMAILTO: "DBA-PostgreSQL@company.ru" 17 | EMAIL_SERVER: "mail.company.ru" 18 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 19 | EMAIL_SEND: "no" 20 | PGHOST: "postgres" 21 | PGPORT: "5432" 22 | PGUSER: "postgres" 23 | PGPASSWORD: "qweasdzxc" 24 | BACKUP_THREADS: "4" 25 | AMCHECK: "true" 26 | HEAPALLINDEXED: "true" 27 | 28 | -------------------------------------------------------------------------------- /16/docker-analyze/Dockerfile: -------------------------------------------------------------------------------- 1 | # Based on: 2 | # https://hub.docker.com/_/debian 3 | # 4 | FROM debian:bookworm-slim 5 | 6 | LABEL maintainer="Sergey Grinko " 7 | 8 | ENV DEBIAN_RELEASE bookworm 9 | ENV PG_MAJOR 16 10 | ENV BACKUP_PATH /mnt/pgbak 11 | 12 | # explicitly set user/group IDs 13 | RUN set -eux; \ 14 | groupadd -r postgres --gid=999; \ 15 | useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres; \ 16 | mkdir -p /var/lib/postgresql/data; 17 | 18 | RUN apt-get update \ 19 | && apt-get install -y --no-install-recommends ca-certificates wget gnupg sendemail bzip2 pgbadger \ 20 | # ... install psql ... 21 | && echo "deb http://apt.postgresql.org/pub/repos/apt $DEBIAN_RELEASE-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ 22 | && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ 23 | && apt-get update \ 24 | && apt-get install -y --no-install-recommends postgresql-client-$PG_MAJOR \ 25 | # ... create dirs ... 26 | && mkdir -p /var/log/postgresql/report \ 27 | && mkdir -p /var/log/pgbouncer \ 28 | && mkdir -p /var/log/mamonsu \ 29 | # ... cleaning ... 30 | && apt-get purge -y make gcc gcc-12 cpp cpp-12 clang* golang* postgresql-server-dev-$PG_MAJOR *-dev *-man \ 31 | && apt-get -f install \ 32 | && apt-get -y autoremove \ 33 | && apt-get -y clean \ 34 | && apt-get -y autoclean \ 35 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/apt/* 36 | 37 | COPY ./analyze_log.sh /usr/local/bin 38 | COPY ./pg_stat_statements_report.sql /var/lib/postgresql 39 | 40 | RUN chown postgres:postgres /var/lib/postgresql/*.sql \ 41 | && chown -R postgres:postgres /var/log/postgresql/report \ 42 | && chown -R postgres:postgres /var/log/pgbouncer \ 43 | && chown -R postgres:postgres /var/log/mamonsu \ 44 | && chmod +x /usr/local/bin/*.sh 45 | 46 | USER postgres 47 | ENTRYPOINT [ "/usr/local/bin/analyze_log.sh" ] 48 | -------------------------------------------------------------------------------- /16/docker-mamonsu/bootstrap_post.sql: -------------------------------------------------------------------------------- 1 | select 'GRANT EXECUTE ON FUNCTION mamonsu.' || oid::regprocedure || ' TO mamonsu;' from pg_proc where pronamespace = 'mamonsu'::regnamespace \gexec 2 | -------------------------------------------------------------------------------- /16/docker-mamonsu/mamonsu_right_add.sql: -------------------------------------------------------------------------------- 1 | select not pg_is_in_recovery() as is_master \gset 2 | \if :is_master 3 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 4 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 5 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 6 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 7 | select current_database() = 'mamonsu' as is_mamonsu_db \gset 8 | \if :is_mamonsu_db 9 | select '''' || case when current_setting('shared_buffers') like '%GB' 10 | then (replace(current_setting('shared_buffers'), 'GB', '')::int)*1024 11 | else replace(current_setting('shared_buffers'), 'MB', '')::int 12 | end * 0.0117 || ' MB''' as highpage_mb \gset 13 | ALTER FUNCTION mamonsu.buffer_cache() SET WORK_MEM = :highpage_mb; -- for shared_buffers 16 Гб 200 Мб 14 | GRANT USAGE ON SCHEMA public TO mamonsu; 15 | GRANT EXECUTE ON FUNCTION public.pg_stat_statements(boolean) TO mamonsu; 16 | \endif 17 | -- we give the right to connect for the role of mamonsu 18 | do $$ begin execute 'GRANT CONNECT ON DATABASE "' || current_database() || '" TO mamonsu; '; end $$; 19 | -- 20 | CREATE SCHEMA IF NOT EXISTS pgbouncer; 21 | GRANT CONNECT ON DATABASE mamonsu TO pgbouncer; 22 | GRANT USAGE ON SCHEMA pgbouncer TO pgbouncer; 23 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 24 | LANGUAGE plpgsql SECURITY DEFINER 25 | AS $$ 26 | BEGIN 27 | SELECT usename, passwd FROM pg_catalog.pg_shadow 28 | WHERE usename = p_username INTO uname, phash; 29 | RETURN; 30 | END; 31 | $$; 32 | \endif 33 | -------------------------------------------------------------------------------- /16/docker-mamonsu/pre.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not pg_is_in_recovery() as is_master \gset 6 | \if :is_master 7 | select not exists(select true FROM pg_catalog.pg_database where datname='mamonsu') as is_db_mamonsu \gset 8 | \if :is_db_mamonsu 9 | CREATE DATABASE mamonsu; 10 | \endif 11 | \c mamonsu 12 | CREATE EXTENSION IF NOT EXISTS pg_buffercache; 13 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 14 | -- check role mamonsu ... 15 | select not exists(select * from pg_roles where rolname = 'mamonsu') as is_role_mamonsu \gset 16 | \if :is_role_mamonsu 17 | select :'MAMONSU_PASSWORD' = '' as is_mamonsu_password_exists \gset 18 | \if :is_mamonsu_password_exists 19 | CREATE ROLE mamonsu LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 20 | \else 21 | CREATE ROLE mamonsu LOGIN PASSWORD :'MAMONSU_PASSWORD' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION; 22 | \endif 23 | \else 24 | select :'MAMONSU_PASSWORD' <> '' as is_mamonsu_password_notexists \gset 25 | \if :is_mamonsu_password_notexists 26 | ALTER ROLE mamonsu WITH PASSWORD :'MAMONSU_PASSWORD' ; 27 | \endif 28 | \endif 29 | GRANT USAGE ON SCHEMA pg_catalog TO mamonsu; 30 | GRANT SELECT ON TABLE pg_proc TO mamonsu; 31 | \endif 32 | 33 | -- get list all current DBs 34 | select string_agg(datname,' ') from pg_catalog.pg_database where not datistemplate; 35 | -------------------------------------------------------------------------------- /16/docker-pgprobackup/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /16/docker-pgprobackup/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /16/docker-pgprocheckdb/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt 39 | /usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`grep -c ERROR ~postgres/backups.txt` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /16/docker-pgprocheckdb/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /16/docker-pgprorestore/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$1" != "" ]; then 24 | EMAIL_SEND=$1 25 | fi 26 | 27 | if [ "$2" != "" ]; then 28 | EMAILTO="$2" 29 | fi 30 | 31 | if [ "$BACKUP_PATH" = "" ]; then 32 | BACKUP_PATH="/mnt/pgbak" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -o tls=no -o message-content-type=html -o message-charset=utf-8 -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /16/docker-pgupgrade/pg_ident.conf: -------------------------------------------------------------------------------- 1 | # PostgreSQL User Name Maps 2 | # ========================= 3 | # 4 | # Refer to the PostgreSQL documentation, chapter "Client 5 | # Authentication" for a complete description. A short synopsis 6 | # follows. 7 | # 8 | # This file controls PostgreSQL user name mapping. It maps external 9 | # user names to their corresponding PostgreSQL user names. Records 10 | # are of the form: 11 | # 12 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 13 | # 14 | # (The uppercase quantities must be replaced by actual values.) 15 | # 16 | # MAPNAME is the (otherwise freely chosen) map name that was used in 17 | # pg_hba.conf. SYSTEM-USERNAME is the detected user name of the 18 | # client. PG-USERNAME is the requested PostgreSQL user name. The 19 | # existence of a record specifies that SYSTEM-USERNAME may connect as 20 | # PG-USERNAME. 21 | # 22 | # If SYSTEM-USERNAME starts with a slash (/), it will be treated as a 23 | # regular expression. Optionally this can contain a capture (a 24 | # parenthesized subexpression). The substring matching the capture 25 | # will be substituted for \1 (backslash-one) if present in 26 | # PG-USERNAME. 27 | # 28 | # Multiple maps may be specified in this file and used by pg_hba.conf. 29 | # 30 | # No map names are defined in the default configuration. If all 31 | # system user names and PostgreSQL user names are the same, you don't 32 | # need anything in this file. 33 | # 34 | # This file is read on server startup and when the postmaster receives 35 | # a SIGHUP signal. If you edit the file on a running system, you have 36 | # to SIGHUP the postmaster for the changes to take effect. You can 37 | # use "pg_ctl reload" to do that. 38 | 39 | # Put your actual configuration here 40 | # ---------------------------------- 41 | 42 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 43 | main postgres backup -------------------------------------------------------------------------------- /16/docker-postgres/locales.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | date format = %Y-%m-%d %H:%M:%S.%z 3 | 4 | [en_US] 5 | date format = %Y-%m-%d %H:%M:%S.%z 6 | language = us_english 7 | charset = iso_1 8 | -------------------------------------------------------------------------------- /16/docker-postgres/pg_ident.conf: -------------------------------------------------------------------------------- 1 | # PostgreSQL User Name Maps 2 | # ========================= 3 | # 4 | # Refer to the PostgreSQL documentation, chapter "Client 5 | # Authentication" for a complete description. A short synopsis 6 | # follows. 7 | # 8 | # This file controls PostgreSQL user name mapping. It maps external 9 | # user names to their corresponding PostgreSQL user names. Records 10 | # are of the form: 11 | # 12 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 13 | # 14 | # (The uppercase quantities must be replaced by actual values.) 15 | # 16 | # MAPNAME is the (otherwise freely chosen) map name that was used in 17 | # pg_hba.conf. SYSTEM-USERNAME is the detected user name of the 18 | # client. PG-USERNAME is the requested PostgreSQL user name. The 19 | # existence of a record specifies that SYSTEM-USERNAME may connect as 20 | # PG-USERNAME. 21 | # 22 | # If SYSTEM-USERNAME starts with a slash (/), it will be treated as a 23 | # regular expression. Optionally this can contain a capture (a 24 | # parenthesized subexpression). The substring matching the capture 25 | # will be substituted for \1 (backslash-one) if present in 26 | # PG-USERNAME. 27 | # 28 | # Multiple maps may be specified in this file and used by pg_hba.conf. 29 | # 30 | # No map names are defined in the default configuration. If all 31 | # system user names and PostgreSQL user names are the same, you don't 32 | # need anything in this file. 33 | # 34 | # This file is read on server startup and when the postmaster receives 35 | # a SIGHUP signal. If you edit the file on a running system, you have 36 | # to SIGHUP the postmaster for the changes to take effect. You can 37 | # use "pg_ctl reload" to do that. 38 | 39 | # Put your actual configuration here 40 | # ---------------------------------- 41 | 42 | # MAPNAME SYSTEM-USERNAME PG-USERNAME 43 | main postgres backup -------------------------------------------------------------------------------- /16/docker-postgres/postgres: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # this is start file for postgres 4 | 5 | # Check on the need to initialize the catalog of the FTS 6 | tar -xzkf /usr/share/postgresql/$PG_MAJOR/tsearch_data.tar.gz -C /usr/share/postgresql/tsearch_data/ > /dev/null 2>&1 7 | 8 | # start postgres process ... 9 | exec /usr/lib/postgresql/$PG_MAJOR/bin/postgres ${@} 10 | -------------------------------------------------------------------------------- /16/docker-postgres/show.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # $1 - yes/no (the sign for send to email, yes - default) 4 | # $2 - list of email recipients (separated by a space) 5 | 6 | if [ "$EMAILTO" = "" ]; then 7 | EMAILTO="DBA-PostgreSQL@company.ru" 8 | fi 9 | 10 | if [ "$EMAIL_SERVER" = "" ]; then 11 | EMAIL_SERVER=mail.company.ru 12 | fi 13 | 14 | if [ "$EMAIL_HOSTNAME" = "" ]; then 15 | EMAIL_HOSTNAME=`hostname` 16 | EMAIL_HOSTNAME="noreplay@${EMAIL_HOSTNAME}.ru" 17 | fi 18 | 19 | if [ "$EMAIL_SEND" = "" ]; then 20 | EMAIL_SEND="yes" 21 | fi 22 | 23 | if [ "$BACKUP_PATH" = "" ]; then 24 | BACKUP_PATH="/mnt/pgbak" 25 | fi 26 | 27 | if [ "$1" != "" ]; then 28 | EMAIL_SEND=$1 29 | fi 30 | 31 | if [ "$2" != "" ]; then 32 | EMAILTO="$2" 33 | fi 34 | 35 | cd $BACKUP_PATH 36 | 37 | # send mail to DBA 38 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH > ~postgres/backups.txt" 39 | su - postgres -c "/usr/bin/pg_probackup-$PG_MAJOR show --backup-path=$BACKUP_PATH --archive >> ~postgres/backups.txt" 40 | 41 | echo "" >> ~postgres/backups.txt 42 | echo "Место на бэкапном устройстве:" >> ~postgres/backups.txt 43 | df -h $BACKUP_PATH >> ~postgres/backups.txt 44 | 45 | ERRORS_COUNT=`su - postgres -c "grep -c ERROR ~postgres/backups.txt"` 46 | EMAIL_SUBJECT="" 47 | if [[ "$ERRORS_COUNT" -ne "0" ]] ; then 48 | EMAIL_SUBJECT="Report backups error" 49 | else 50 | EMAIL_SUBJECT="Report backups" 51 | fi 52 | 53 | cat ~postgres/backups.txt 54 | if [ "$EMAIL_SEND" = "yes" ]; then 55 | (echo 'List of all cluster backups:
' ; cat ~postgres/backups.txt ; echo '
';) | sendEmail -f "$EMAIL_HOSTNAME" -t $EMAILTO -s $EMAIL_SERVER -u $EMAIL_SUBJECT 56 | fi 57 | -------------------------------------------------------------------------------- /16/docker-postgres/sql/background_start.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.background_start(p_command text) RETURNS void 2 | LANGUAGE plpgsql 3 | AS $$ 4 | /* 5 | Запускает указанную команду отдельным фоновым процессом без ожидания возврата результата 6 | */ 7 | declare v_pid integer = pg_background_launch(p_command); 8 | begin 9 | perform pg_sleep(0.1); 10 | perform pg_background_detach(v_pid); 11 | end; 12 | $$; -------------------------------------------------------------------------------- /16/docker-postgres/sql/db_target.sql: -------------------------------------------------------------------------------- 1 | -- 2 | -- code only for the target (additionally specified) database 3 | -- 4 | 5 | SET default_transaction_read_only = off; 6 | SET client_encoding = 'UTF8'; 7 | SET standard_conforming_strings = on; 8 | 9 | select current_database() as dbconnect \gset 10 | select rolname as role_deploy from pg_roles where rolname ilike '%deploy%' limit 1 \gset 11 | 12 | ALTER DATABASE :"dbconnect" OWNER TO :"role_deploy"; 13 | GRANT ALL ON DATABASE :"dbconnect" TO :"role_deploy"; 14 | ALTER DATABASE :"dbconnect" SET search_path = :DEV_SCHEMA, public, tiger; 15 | -------------------------------------------------------------------------------- /16/docker-postgres/sql/first_db.sql: -------------------------------------------------------------------------------- 1 | select datname from pg_database where not datistemplate and datname not in ('postgres','mamonsu') limit 1; 2 | -------------------------------------------------------------------------------- /16/docker-postgres/sql/post_warning.sql: -------------------------------------------------------------------------------- 1 | SET default_transaction_read_only = off; 2 | SET client_encoding = 'UTF8'; 3 | SET standard_conforming_strings = on; 4 | 5 | select not (setting ~ 'shared_ispell') as is_shared_ispell_notloaded from pg_settings where name ~ 'shared_preload_libraries' \gset 6 | \if :is_shared_ispell_notloaded 7 | \echo "" 8 | \echo "-- ================================================================================================================ --" 9 | \echo "Please, after the 1st start of the container with an empty database directory, сorrect in the postgreSQL.conf file," 10 | \echo "the 'shared_preload_libraries' parameter it must include the download of the 'shared_ispell' library " 11 | \echo "and re-run the script: update-extension.sh" 12 | \echo "-- ================================================================================================================ --" 13 | \endif 14 | -------------------------------------------------------------------------------- /16/docker-postgres/sql/replace_char_xml.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION util.replace_char_xml(p_str2xml text) RETURNS text 2 | LANGUAGE sql IMMUTABLE PARALLEL SAFE COST 10.0 3 | AS $$ 4 | select replace(replace(replace(replace(replace(p_str2xml,'&','&'),'''','''),'"','"'),'<','<'),'>','>'); 5 | $$; 6 | -------------------------------------------------------------------------------- /16/docker-postgres/sql/user_lookup.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(p_username text, OUT uname text, OUT phash text) RETURNS record 2 | LANGUAGE plpgsql SECURITY DEFINER 3 | AS $$ 4 | BEGIN 5 | SELECT usename, passwd FROM pg_catalog.pg_shadow 6 | WHERE usename = p_username INTO uname, phash; 7 | RETURN; 8 | END; 9 | $$; 10 | -------------------------------------------------------------------------------- /16/docker-postgres/sql/vw_locks.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_locks AS 2 | SELECT pg_locks.pid, 3 | pg_locks.virtualtransaction AS vxid, 4 | pg_locks.locktype AS lock_type, 5 | pg_locks.mode AS lock_mode, 6 | pg_locks.granted, 7 | CASE 8 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 9 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 10 | ELSE pg_locks.transactionid::text 11 | END AS xid_lock, 12 | pg_class.relname, 13 | pg_locks.page, 14 | pg_locks.tuple, 15 | pg_locks.classid, 16 | pg_locks.objid, 17 | pg_locks.objsubid 18 | FROM pg_locks 19 | LEFT JOIN pg_class ON pg_locks.relation = pg_class.oid 20 | WHERE pg_locks.pid <> pg_backend_pid() AND pg_locks.virtualtransaction IS DISTINCT FROM pg_locks.virtualxid 21 | ORDER BY pg_locks.pid, pg_locks.virtualtransaction, pg_locks.granted DESC, ( 22 | CASE 23 | WHEN pg_locks.virtualxid IS NOT NULL AND pg_locks.transactionid IS NOT NULL THEN (pg_locks.virtualxid || ' '::text) || pg_locks.transactionid 24 | WHEN pg_locks.virtualxid IS NOT NULL THEN pg_locks.virtualxid 25 | ELSE pg_locks.transactionid::text 26 | END), pg_locks.locktype, pg_locks.mode, pg_class.relname; 27 | -------------------------------------------------------------------------------- /16/docker-postgres/sql/vw_partitions.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_partitions AS 2 | WITH RECURSIVE inheritance_tree AS ( 3 | SELECT c_1.oid AS table_oid, 4 | n.nspname AS table_schema, 5 | c_1.relname AS table_name, 6 | NULL::name AS table_parent_schema, 7 | NULL::name AS table_parent_name, 8 | c_1.relispartition AS is_partition 9 | FROM pg_class c_1 10 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 11 | WHERE c_1.relkind = 'p'::"char" AND c_1.relispartition = false 12 | UNION ALL 13 | SELECT inh.inhrelid AS table_oid, 14 | n.nspname AS table_schema, 15 | c_1.relname AS table_name, 16 | nn.nspname AS table_parent_schema, 17 | cc.relname AS table_parent_name, 18 | c_1.relispartition AS is_partition 19 | FROM inheritance_tree it_1 20 | JOIN pg_inherits inh ON inh.inhparent = it_1.table_oid 21 | JOIN pg_class c_1 ON inh.inhrelid = c_1.oid 22 | JOIN pg_namespace n ON n.oid = c_1.relnamespace 23 | JOIN pg_class cc ON it_1.table_oid = cc.oid 24 | JOIN pg_namespace nn ON nn.oid = cc.relnamespace 25 | ) 26 | SELECT it.table_schema, 27 | it.table_name, 28 | c.reltuples, 29 | c.relpages, 30 | CASE p.partstrat 31 | WHEN 'l'::"char" THEN 'BY LIST'::text 32 | WHEN 'r'::"char" THEN 'BY RANGE'::text 33 | WHEN 'h'::"char" THEN 'BY HASH'::text 34 | ELSE 'not partitioned'::text 35 | END AS partitionin_type, 36 | it.table_parent_schema, 37 | it.table_parent_name, 38 | pg_get_expr(c.relpartbound, c.oid, true) AS partitioning_values, 39 | pg_get_expr(p.partexprs, c.oid, true) AS sub_partitioning_values 40 | FROM inheritance_tree it 41 | JOIN pg_class c ON c.oid = it.table_oid 42 | LEFT JOIN pg_partitioned_table p ON p.partrelid = it.table_oid 43 | ORDER BY it.table_name, c.reltuples; -------------------------------------------------------------------------------- /16/docker-postgres/sql/vw_who.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.state, 5 | now() - pa.xact_start AS ts_age, 6 | clock_timestamp() - pa.xact_start AS xact_age, 7 | clock_timestamp() - pa.query_start AS query_age, 8 | clock_timestamp() - pa.state_change AS change_age, 9 | pa.datname, 10 | pa.usename, 11 | pa.wait_event_type, 12 | pa.wait_event, 13 | pa.client_addr, 14 | pa.client_port, 15 | pa.application_name, 16 | pa.backend_type, 17 | pa.query 18 | FROM pg_stat_activity pa 19 | WHERE pa.pid <> pg_backend_pid() 20 | ORDER BY pa.datname, pa.state, pa.xact_start; 21 | -------------------------------------------------------------------------------- /16/docker-postgres/sql/vw_who_13plus.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW public.vw_who AS 2 | SELECT pa.pid, 3 | pg_blocking_pids(pa.pid) AS blocked_by, 4 | pa.leader_pid, 5 | pa.state, 6 | now() - pa.xact_start AS ts_age, 7 | clock_timestamp() - pa.xact_start AS xact_age, 8 | clock_timestamp() - pa.query_start AS query_age, 9 | clock_timestamp() - pa.state_change AS change_age, 10 | pa.datname, 11 | pa.usename, 12 | pa.wait_event_type, 13 | pa.wait_event, 14 | pa.client_addr, 15 | pa.client_port, 16 | pa.application_name, 17 | pa.backend_type, 18 | pa.query 19 | FROM pg_stat_activity pa 20 | WHERE pa.pid <> pg_backend_pid() 21 | ORDER BY pa.datname, pa.state, pa.xact_start, pa.leader_pid NULLS FIRST; 22 | -------------------------------------------------------------------------------- /16/docker_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # создаём все необходимые каталоги 3 | mkdir -p /mnt/pgbak2 /var/log/postgresql1 /var/log/pgbouncer1 /var/log/mamonsu1 /var/lib/pgsql/16_1 /usr/share/postgres/16_1/tsearch_data 4 | chown 999:999 /var/log/postgresql1 /var/lib/pgsql/16_1 /var/log/pgbouncer1 /var/log/mamonsu1 /mnt/pgbak2 /usr/share/postgres/16_1 /usr/share/postgres/16_1/tsearch_data 5 | # стартуем докер 6 | docker run --rm --name my_postgres_16 --shm-size 2147483648 -p 5433:5432/tcp --stop-timeout 60 \ 7 | -v /var/lib/pgsql/16_1/data:/var/lib/postgresql/data \ 8 | -v /var/log/postgresql1:/var/log/postgresql \ 9 | -v /mnt/pgbak2/:/mnt/pgbak \ 10 | -v /usr/share/postgres/16_1/tsearch_data:/usr/share/postgresql/tsearch_data \ 11 | -e POSTGRES_PASSWORD=postgres -e POSTGRES_HOST_AUTH_METHOD=trust -e DEPLOY_PASSWORD=postgres -e PGBOUNCER_PASSWORD=postgres -e TZ="Etc/UTC" \ 12 | grufos/postgres:16.2 \ 13 | -c shared_preload_libraries="plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm" -c shared_ispell.max_size=70MB 14 | -------------------------------------------------------------------------------- /16/postgres-pgupgrade.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgupgrade: 5 | 6 | # image: grufos/pgupgrade:16.1 7 | build: 8 | context: ./docker-pgupgrade 9 | dockerfile: Dockerfile 10 | stop_grace_period: 60s 11 | shm_size: '2gb' 12 | volumes: 13 | - "/var/lib/pgsql/16_1:/var/lib/postgresql" 14 | - "/var/log/postgresql1:/var/log/postgresql" 15 | - "/usr/share/postgres/15_1/tsearch_data:/usr/share/postgresql/15/tsearch_data" 16 | - "/usr/share/postgres/16_1/tsearch_data:/usr/share/postgresql/16/tsearch_data" 17 | environment: 18 | PGDATACOPY_MODE: HardLink 19 | -------------------------------------------------------------------------------- /16/postgres-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | postgres: 5 | 6 | # image: grufos/postgres:16.2 7 | build: 8 | context: ./docker-postgres 9 | dockerfile: Dockerfile 10 | stop_grace_period: 60s 11 | shm_size: '2gb' 12 | command: | 13 | -c shared_preload_libraries='plugin_debugger,plpgsql_check,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm' 14 | -c shared_ispell.max_size=70MB 15 | volumes: 16 | - "/var/lib/pgsql/16_1/data:/var/lib/postgresql/data" 17 | - "/var/log/postgresql1:/var/log/postgresql" 18 | - "/mnt/pgbak2/:/mnt/pgbak/" 19 | - "/usr/share/postgres/16_1/tsearch_data:/usr/share/postgresql/tsearch_data" 20 | - "/var/lib/pgsql/16_1/app_db_init_sql:/app_db_init_sql" 21 | ports: 22 | - "5433:5432" 23 | environment: 24 | ENV_DB_VALUE: DEV 25 | APP_DB: "My_db" 26 | APP_DB_PASSWORD: qweasdzxc 27 | # POSTGRES_INITDB_ARGS: "--locale=ru_RU.UTF8 --data-checksums" 28 | POSTGRES_PASSWORD: qweasdzxc 29 | POSTGRES_HOST_AUTH_METHOD: trust 30 | DEPLOY_PASSWORD: qweasdzxc 31 | PGBOUNCER_PASSWORD: zxcasdqwe 32 | # TZ: "Etc/UTC" 33 | TZ: "Europe/Moscow" 34 | EMAILTO: "DBA-PostgreSQL@company.ru" 35 | EMAIL_SERVER: "mail.company.ru" 36 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 37 | BACKUP_THREADS: "4" 38 | BACKUP_MODE: "" 39 | 40 | -------------------------------------------------------------------------------- /16/restore-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprorestore: 5 | build: 6 | context: ./docker-pgprorestore 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/var/lib/pgsql/16_1/data:/var/lib/postgresql/data" 11 | - "/mnt/pgbak2/:/mnt/pgbak/" 12 | 13 | environment: 14 | TZ: "Europe/Moscow" 15 | BACKUP_THREADS: "4" 16 | # восстановление на указанную точку во времени 17 | # TARGET_TIME: "2020-10-22 06:00:00" 18 | # восстановление на указанный срез в архиве 19 | # TARGET_ID: "QILQ45" 20 | # если ни один из этих параметров не указан, то восстановление выполняется на состояние - latest (самое последнее состояние) -------------------------------------------------------------------------------- /16/show_backup-service.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | 4 | pgprobackup_show: 5 | build: 6 | context: ./docker-pgprobackup 7 | dockerfile: Dockerfile 8 | 9 | volumes: 10 | - "/mnt/pgbak2/:/mnt/pgbak/" 11 | 12 | environment: 13 | TZ: "Europe/Moscow" 14 | EMAILTO: "DBA-PostgreSQL@company.ru" 15 | EMAIL_SERVER: "mail.company.ru" 16 | EMAIL_HOSTNAME: "noreplay@myhost.ru" 17 | EMAIL_SEND: "no" 18 | 19 | entrypoint: "/usr/local/bin/show.sh" 20 | -------------------------------------------------------------------------------- /16/upgrade_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker run --rm --name upgrade-db --shm-size 2147483648 \ 3 | -v /var/lib/pgsql/16_1:/var/lib/postgresql \ 4 | -v /var/log/postgresql1:/var/log/postgresql \ 5 | -v /usr/share/postgres/15/tsearch_data:/usr/share/postgresql/15/tsearch_data \ 6 | -v /usr/share/postgres/16/tsearch_data:/usr/share/postgresql/16/tsearch_data \ 7 | -e PGDATACOPY_MODE=HardLink \ 8 | 16_pgupgrade 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Sergey Grinko 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | --------------------------------------------------------------------------------