--- /dev/null
+prod:5432
+td:54321
--- /dev/null
+#!/bin/sh
+
+
+SCRIPT_PATH=$(realpath $(dirname $0))
+DATA_PATH=$(realpath $SCRIPT_PATH/../data)
+
+FQ_POSTGRESQL_PATH=/data/postgresql
+FQ_BACKUP_PATH=$FQ_POSTGRESQL_PATH/backups
+FQ_DUMP_PATH=$FQ_POSTGRESQL_PATH/dumps
+FQ_WAL_ARCHIVE_PATH=$FQ_POSTGRESQL_PATH/wal-archive
+
+
+# create the base directory structure
+if [ ! -d $FQ_POSTGRESQL_PATH ]
+then
+ mkdir $FQ_POSTGRESQL_PATH
+fi
+chown postgres:postgres $FQ_POSTGRESQL_PATH
+chmod 700 $FQ_POSTGRESQL_PATH
+if [ ! -d $FQ_BACKUP_PATH ]
+then
+ mkdir $FQ_BACKUP_PATH
+fi
+chown postgres:postgres $FQ_BACKUP_PATH
+chmod 700 $FQ_BACKUP_PATH
+if [ ! -d $FQ_DUMP_PATH ]
+then
+ mkdir $FQ_DUMP_PATH
+fi
+chown postgres:postgres $FQ_DUMP_PATH
+chmod 700 $FQ_DUMP_PATH
+if [ ! -d $FQ_WAL_ARCHIVE_PATH ]
+then
+ mkdir $FQ_WAL_ARCHIVE_PATH
+fi
+chown postgres:postgres $FQ_WAL_ARCHIVE_PATH
+chmod 700 $FQ_WAL_ARCHIVE_PATH
+
+
+# create the database clusters (production, test & development)
+cat $DATA_PATH/postgresql.clusters | while read DBC_NAME_PORT
+do
+ DBC_NAME=$(echo $DBC_NAME_PORT | cut -f 1 -d ':')
+ DBC_PORT=$(echo $DBC_NAME_PORT | cut -f 2 -d ':')
+ DBC_PATH=${DBC_NAME}-dbc
+ FQ_DBC_PATH=$FQ_POSTGRESQL_PATH/$DBC_PATH
+ FQ_DBC_WAL_ARCHIVE_PATH=$FQ_WAL_ARCHIVE_PATH/$DBC_PATH
+
+ if [ ! -d $FQ_DBC_WAL_ARCHIVE_PATH ]
+ then
+ mkdir $FQ_DBC_WAL_ARCHIVE_PATH
+ fi
+ chown postgres:postgres $FQ_DBC_WAL_ARCHIVE_PATH
+ chmod 700 $FQ_DBC_WAL_ARCHIVE_PATH
+
+ postgresql-new-systemd-unit \
+ --unit postgresql@$DBC_NAME \
+ --datadir $FQ_DBC_PATH
+
+ if [ ! -d $FQ_DBC_PATH ]
+ then
+ postgresql-setup \
+ --initdb \
+ --port=$DBC_PORT \
+ --unit=postgresql@$DBC_NAME
+ fi
+done
+
+sed --in-place=.orig \
+ 's/^MAILTO=root$/MAILTO=zoltan.felleg@userrendszerhaz.hu/' \
+ /etc/crontab
+echo >>/etc/crontab
+echo '0 2 * * * postgres /usr/local/bin/backup_postgresql.sh' >>/etc/crontab
+++ /dev/null
-#!/bin/sh
-
-
-POSTGRESQL_PATH=/data/postgresql
-DUMP_PATH=$POSTGRESQL_PATH/dumps
-WAL_ARCHIVE_PATH=$POSTGRESQL_PATH/wal-archive
-
-
-if [ ! -d $POSTGRESQL_PATH ]
-then
- mkdir $POSTGRESQL_PATH
-fi
-chown postgres:postgres $POSTGRESQL_PATH
-if [ ! -d $DUMP_PATH ]
-then
- mkdir $DUMP_PATH
-fi
-chown postgres:postgres $DUMP_PATH
-if [ ! -d $WAL_ARCHIVE_PATH ]
-then
- mkdir $WAL_ARCHIVE_PATH
-fi
-
-# create the main database cluster
-MAIN_DBC_NAME=main-dbc
-MAIN_DBC_PATH=$POSTGRESQL_PATH/$MAIN_DBC_NAME
-MAIN_DBC_DUMP_PATH=$DUMP_PATH/$MAIN_DBC_NAME
-MAIN_DBC_WAL_ARCHIVE_PATH=$WAL_ARCHIVE_PATH/$MAIN_DBC_NAME
-
-if [ ! -d $MAIN_DBC_DUMP_PATH ]
-then
- mkdir $MAIN_DBC_DUMP_PATH
-fi
-chown postgres:postgres $MAIN_DBC_DUMP_PATH
-if [ ! -d $MAIN_DBC_WAL_ARCHIVE_PATH ]
-then
- mkdir $MAIN_DBC_WAL_ARCHIVE_PATH
-fi
-chown postgres:postgres $MAIN_DBC_WAL_ARCHIVE_PATH
-
-postgresql-new-systemd-unit \
- --unit postgresql@main \
- --datadir $MAIN_DBC_PATH
-
-if [ ! -d $MAIN_DBC_PATH ]
-then
- postgresql-setup \
- --initdb \
- --port=5432 \
- --unit=postgresql@main
-fi
-
-# create the test & devel database cluster
-TD_DBC_NAME=td-dbc
-TD_DBC_PATH=$POSTGRESQL_PATH/$TD_DBC_NAME
-
-postgresql-new-systemd-unit \
- --unit postgresql@td \
- --datadir $TD_DBC_PATH
-
-if [ ! -d $TD_DBC_PATH ]
-then
- postgresql-setup \
- --initdb \
- --port=54321 \
- --unit=postgresql@td
-fi
#!/bin/sh
-systemctl enable postgresql@main.service
-systemctl start postgresql@main.service
-systemctl enable postgresql@td.service
-systemctl start postgresql@td.service
+SCRIPT_PATH=$(realpath $(dirname $0))
+DATA_PATH=$(realpath $SCRIPT_PATH/../data)
+
+
systemctl enable NetworkManager-wait-online.service
systemctl start NetworkManager-wait-online.service
+systemctl enable crond.service
+systemctl start crond.service
+systemctl enable postfix.service
+systemctl start postfix.service
+cat $DATA_PATH/postgresql.clusters | while read DBC_NAME_PORT
+do
+ DBC_NAME=$(echo $DBC_NAME_PORT | cut -f 1 -d ':')
+ systemctl enable postgresql@${DBC_NAME}.service
+ systemctl start postgresql@${DBC_NAME}.service
+done
systemctl enable logrotate.timer
systemctl start logrotate.timer
FQ_WAL_FILE=$1
WAL_FILE=$2
-POSTGRESQL_PATH=/data/postgresql
-WAL_ARCHIVE_PATH=$POSTGRESQL_PATH/wal-archive
-MAIN_DBC_NAME=main-dbc
-MAIN_DBC_PATH=$POSTGRESQL_PATH/$MAIN_DBC_NAME
-MAIN_DBC_WAL_ARCHIVE_PATH=$WAL_ARCHIVE_PATH/$MAIN_DBC_NAME
+FQ_POSTGRESQL_PATH=/data/postgresql
+FQ_WAL_ARCHIVE_PATH=$FQ_POSTGRESQL_PATH/wal-archive
+DBC_NAME=prod
+DBC_PATH=${DBC_NAME}-dbc
+FQ_DBC_PATH=$FQ_POSTGRESQL_PATH/$DBC_PATH
+FQ_DBC_WAL_ARCHIVE_PATH=$FQ_WAL_ARCHIVE_PATH/$DBC_PATH
-if [ -f $MAIN_DBC_WAL_ARCHIVE_PATH/${WAL_FILE}.gz ]
+
+if [ -f $FQ_DBC_WAL_ARCHIVE_PATH/${WAL_FILE}.gz ]
then
- ARCHIVED_CHECKSUM=$(md5sum $MAIN_DBC_WAL_ARCHIVE_PATH/${WAL_FILE}.gz \
+ ARCHIVED_CHECKSUM=$(md5sum $FQ_DBC_WAL_ARCHIVE_PATH/${WAL_FILE}.gz \
| cut -f 1 -d ' ')
- CURRENT_CHECKSUM=$(gzip --to-stdout $MAIN_DBC_PATH/$FQ_WAL_FILE \
+ CURRENT_CHECKSUM=$(gzip --to-stdout $FQ_DBC_PATH/$FQ_WAL_FILE \
| md5sum | cut -f 1 -d ' ')
if [ "$ARCHIVED_CHECKSUM" == "$CURRENT_CHECKSUM" ]
then
exit 1
fi
else
- cp --archive $MAIN_DBC_PATH/$FQ_WAL_FILE $MAIN_DBC_WAL_ARCHIVE_PATH
- gzip $MAIN_DBC_WAL_ARCHIVE_PATH/$WAL_FILE
+ cp --archive $FQ_DBC_PATH/$FQ_WAL_FILE $FQ_DBC_WAL_ARCHIVE_PATH
+ gzip $FQ_DBC_WAL_ARCHIVE_PATH/$WAL_FILE
fi
CURRENT_DATE=$(date +%Y%m%d)
-POSTGRESQL_PATH=/data/postgresql
-DUMP_PATH=$POSTGRESQL_PATH/dumps
-WAL_ARCHIVE_PATH=$POSTGRESQL_PATH/wal-archive
-MAIN_DBC_NAME=main-dbc
-MAIN_DBC_DUMP_PATH=$DUMP_PATH/$MAIN_DBC_NAME
-MAIN_DBC_WAL_ARCHIVE_PATH=$WAL_ARCHIVE_PATH/$MAIN_DBC_NAME
-MAIN_DBC_DUMP_FILE=$MAIN_DBC_DUMP_PATH/dumpall.$CURRENT_DATE
+FQ_POSTGRESQL_PATH=/data/postgresql
+FQ_BACKUP_PATH=$FQ_POSTGRESQL_PATH/backups
+FQ_DUMP_PATH=$FQ_POSTGRESQL_PATH/dumps
+FQ_WAL_ARCHIVE_PATH=$FQ_POSTGRESQL_PATH/wal-archive
+PROD_DBC_NAME=prod
+PROD_DBC_PATH=${PROD_DBC_NAME}-dbc
+PROD_DBC_BACKUP_PATH=${PROD_DBC_PATH}-$CURRENT_DATE
+FQ_PROD_DBC_BACKUP_PATH=$FQ_BACKUP_PATH/$PROD_DBC_BACKUP_PATH
+PROD_DBC_DUMP_FILE=${PROD_DBC_PATH}-$CURRENT_DATE
+FQ_PROD_DBC_DUMP_FILE=$FQ_DUMP_PATH/$PROD_DBC_DUMP_FILE
+FQ_PROD_DBC_WAL_ARCHIVE_PATH=$FQ_WAL_ARCHIVE_PATH/$PROD_DBC_PATH
-pg_dumpall --clean --if-exists --file=$MAIN_DBC_DUMP_FILE
-gzip $MAIN_DBC_DUMP_FILE
+#create backup
+echo -n "Backing up $PROD_DBC_NAME database cluster to "
+echo "$FQ_PROD_DBC_BACKUP_PATH (via pg_basebackup)"
+pg_basebackup \
+ --pgdata=$FQ_PROD_DBC_BACKUP_PATH \
+ --format=tar \
+ --gzip \
+ --label="$CURRENT_DATE"
+# delete old backup(s)
# non-start-or-middle-of-months
-NONSOMOMS=$(ls $MAIN_DBC_DUMP_PATH/dumpall.* \
+REGEXP="^${PROD_DBC_PATH}-[0-9]\{8\}$"
+NONSOMOMS=$(ls $FQ_BACKUP_PATH \
+ | grep --regexp="$REGEXP" \
| grep --invert-match \
- --regexp='01.gz$' \
- --regexp='15.gz$' | wc -l)
+ --regexp='\(01\|15\)$' | wc -l)
while [ $NONSOMOMS -gt 5 ]
do
- FIRST_NONSOMOM=$(ls $MAIN_DBC_DUMP_PATH/dumpall.* \
+ FIRST_NONSOMOM=$(ls $FQ_BACKUP_PATH \
+ | grep --regexp="$REGEXP" \
| grep --invert-match \
- --regexp='01.gz$' \
- --regexp='15.gz$' | wc -l)
- rm --force --recursive $FIRST_NONSOMOM
- NONSOMOMS=$(ls $MAIN_DBC_DUMP_PATH/dumpall.* \
+ --regexp='\(01\|15\)$' | head -n 1)
+ rm --force --recursive $FQ_BACKUP_PATH/$FIRST_NONSOMOM
+ NONSOMOMS=$(ls $FQ_BACKUP_PATH \
+ | grep --regexp="$REGEXP" \
| grep --invert-match \
- --regexp='01.gz$' \
- --regexp='15.gz$' | wc -l)
+ --regexp='\(01\|15\)$' | wc -l)
+done
+# start-or-middle-of-months
+SOMOMS=$(ls $FQ_BACKUP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --regexp='\(01\|15\)$' | wc -l)
+while [ $SOMOMS -gt 5 ]
+do
+ FIRST_SOMOM=$(ls $FQ_BACKUP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --regexp='\(01\|15\)$' | head -n 1)
+ rm --force --recursive $FQ_BACKUP_PATH/$FIRST_SOMOM
+ SOMOMS=$(ls $FQ_BACKUP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --regexp='\(01\|15\)$' | wc -l)
done
+# create dump
+echo -n "Backing up $PROD_DBC_NAME database cluster to "
+echo "${FQ_PROD_DBC_DUMP_FILE}.gz (via pg_dumpall)"
+rm --force $FQ_PROD_DBC_DUMP_FILE ${FQ_PROD_DBC_DUMP_FILE}.gz
+pg_dumpall --clean --if-exists --file=$FQ_PROD_DBC_DUMP_FILE
+gzip $FQ_PROD_DBC_DUMP_FILE
+chmod 600 ${FQ_PROD_DBC_DUMP_FILE}.gz
+
+# delete old dump(s)
+# non-start-or-middle-of-months
+REGEXP="^${PROD_DBC_PATH}-[0-9]\{8\}\.gz$"
+NONSOMOMS=$(ls $FQ_DUMP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --invert-match \
+ --regexp='\(01\|15\)\.gz$' | wc -l)
+while [ $NONSOMOMS -gt 5 ]
+do
+ FIRST_NONSOMOM=$(ls $FQ_DUMP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --invert-match \
+ --regexp='\(01\|15\)\.gz$' | head -n 1)
+ rm --force $FQ_DUMP_PATH/$FIRST_NONSOMOM
+ NONSOMOMS=$(ls $FQ_DUMP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --invert-match \
+ --regexp='\(01\|15\)\.gz$' | wc -l)
+done
# start-or-middle-of-months
-SOMOMS=$(ls $MAIN_DBC_DUMP_PATH/dumpall.* \
- | grep --regexp='01.gz$' \
- --regexp='15.gz$' | wc -l)
+SOMOMS=$(ls $FQ_DUMP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --regexp='\(01\|15\)\.gz$' | wc -l)
while [ $SOMOMS -gt 5 ]
do
- FIRST_SOMOM=$(ls $MAIN_DBC_DUMP_PATH/dumpall.* \
- | grep --regexp='01.gz$' \
- --regexp='15.gz$' | wc -l)
- rm --force --recursive $FIRST_SOMOM
- SOMOMS=$(ls $MAIN_DBC_DUMP_PATH/dumpall.* \
- | grep --regexp='01.gz$' \
- --regexp='15.gz$' | wc -l)
+ FIRST_SOMOM=$(ls $FQ_DUMP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --regexp='\(01\|15\)\.gz$' | head -n 1)
+ rm --force $FQ_DUMP_PATH/$FIRST_SOMOM
+ SOMOMS=$(ls $FQ_DUMP_PATH \
+ | grep --regexp="$REGEXP" \
+ | grep --regexp='\(01\|15\)\.gz$' | wc -l)
done
-# WAL
-OLDEST_DUMP_FILE=$(ls -t $MAIN_DBC_DUMP_PATH/dumpall.* | head -n 1)
-find $MAIN_DBC_WAL_ARCHIVE_PATH ! -newer $OLDEST_DUMP_FILE | xargs rm --force
+# delete old/unneeded WAL file(s)
+REGEXP="^${PROD_DBC_PATH}-[0-9]\{8\}$"
+OLDEST_BACKUP_PATH=$(ls $FQ_BACKUP_PATH \
+ | grep --regexp="$REGEXP" \
+ | head -n 1)
+FQ_OLDEST_BACKUP_PATH=$FQ_BACKUP_PATH/$OLDEST_BACKUP_PATH
+FQ_OLDEST_WAL_TAR=$FQ_OLDEST_BACKUP_PATH/pg_wal.tar.gz
+# OWFN: oldest wal file needed
+OWFN=$(tar --list --file $FQ_OLDEST_WAL_TAR --gunzip \
+ | sort | head -n 1)
+# OAWFN: oldest archived wal file needed
+FQ_OAWFN=$FQ_PROD_DBC_WAL_ARCHIVE_PATH/${OWFN}.gz
+# AWF: archived wal file
+ls $FQ_PROD_DBC_WAL_ARCHIVE_PATH | while read AWF
+do
+ FQ_AWF=$FQ_PROD_DBC_WAL_ARCHIVE_PATH/$AWF
+ if [ $FQ_AWF -ot $FQ_OAWFN ]
+ then
+ echo "removing $FQ_AWF"
+ rm --force $FQ_AWF
+ fi
+done
FQ_WAL_FILE=$1
WAL_FILE=$2
-POSTGRESQL_PATH=/data/postgresql
-WAL_ARCHIVE_PATH=$POSTGRESQL_PATH/wal-archive
-MAIN_DBC_NAME=main-dbc
-MAIN_DBC_PATH=$POSTGRESQL_PATH/$MAIN_DBC_NAME
-MAIN_DBC_WAL_ARCHIVE_PATH=$WAL_ARCHIVE_PATH/$MAIN_DBC_NAME
+FQ_POSTGRESQL_PATH=/data/postgresql
+FQ_WAL_ARCHIVE_PATH=$FQ_POSTGRESQL_PATH/wal-archive
+DBC_NAME=prod
+DBC_PATH=${DBC_NAME}-dbc
+FQ_DBC_PATH=$FQ_POSTGRESQL_PATH/$DBC_PATH
+FQ_DBC_WAL_ARCHIVE_PATH=$FQ_WAL_ARCHIVE_PATH/$DBC_PATH
-if [ -f $MAIN_DBC_WAL_ARCHIVE_PATH/${WAL_FILE}.gz ]
+
+if [ -f $FQ_DBC_WAL_ARCHIVE_PATH/${WAL_FILE}.gz ]
then
- cp --archive $MAIN_DBC_WAL_ARCHIVE_PATH/${WAL_FILE}.gz \
- $MAIN_DBC_PATH/${FQ_WAL_FILE}.gz
- gunzip $MAIN_DBC_PATH/${FQ_WAL_FILE}.gz
+ cp --archive $FQ_DBC_WAL_ARCHIVE_PATH/${WAL_FILE}.gz \
+ $FQ_DBC_PATH/${FQ_WAL_FILE}.gz
+ gunzip $FQ_DBC_PATH/${FQ_WAL_FILE}.gz
else
exit 1
fi
systemctl disable NetworkManager-wait-online.service
+systemctl disable crond.service
+systemctl disable postfix.service
systemctl disable logrotate.timer
+++ /dev/null
-#!/bin/sh
-
-
-echo '10 2 * * * postgresql /usr/local/bin/backup_postgresql.sh' >>/etc/crontab
glibc-langpack-en \
glibc-langpack-hu \
glibc-locale-source \
- postgresql-server \
+ man-db \
openssh-clients \
- openssh-server"
+ openssh-server \
+ postfix \
+ postgresql-server"