' ; 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
' ; 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
' ; 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
' ; 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
' ; 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
' ; 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
' ; 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
' ; 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
' ; 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