Updated pgs.in (synchronized from/with qqcs-lxc).
authorZoltán Felleg <zoltan.felleg@userrendszerhaz.hu>
Sat, 20 Dec 2025 09:18:51 +0000 (10:18 +0100)
committerZoltán Felleg <zoltan.felleg@userrendszerhaz.hu>
Sat, 20 Dec 2025 09:18:51 +0000 (10:18 +0100)
sources/pgs.in/c3d/firstboot/data/postgresql.clusters [new file with mode: 0644]
sources/pgs.in/c3d/firstboot/scripts/10_setuppostgres.sh [new file with mode: 0755]
sources/pgs.in/c3d/firstboot/scripts/10_setuppostgresql.sh [deleted file]
sources/pgs.in/c3d/firstboot/scripts/90_setupservices.sh
sources/pgs.in/c3d/postinstall/install-data/usr/local/bin/archive_command.sh [changed mode: 0644->0755]
sources/pgs.in/c3d/postinstall/install-data/usr/local/bin/backup_postgresql.sh [changed mode: 0644->0755]
sources/pgs.in/c3d/postinstall/install-data/usr/local/bin/restore_command.sh [changed mode: 0644->0755]
sources/pgs.in/c3d/postinstall/scripts/10_setupservices.sh
sources/pgs.in/c3d/postinstall/scripts/20_setupcrontab.sh [deleted file]
sources/pgs.in/envvars

diff --git a/sources/pgs.in/c3d/firstboot/data/postgresql.clusters b/sources/pgs.in/c3d/firstboot/data/postgresql.clusters
new file mode 100644 (file)
index 0000000..fa2e59f
--- /dev/null
@@ -0,0 +1,2 @@
+prod:5432
+td:54321
diff --git a/sources/pgs.in/c3d/firstboot/scripts/10_setuppostgres.sh b/sources/pgs.in/c3d/firstboot/scripts/10_setuppostgres.sh
new file mode 100755 (executable)
index 0000000..c9f580f
--- /dev/null
@@ -0,0 +1,73 @@
+#!/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
diff --git a/sources/pgs.in/c3d/firstboot/scripts/10_setuppostgresql.sh b/sources/pgs.in/c3d/firstboot/scripts/10_setuppostgresql.sh
deleted file mode 100755 (executable)
index 4a080df..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/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
index 4830d4eb1bd11d0add99f3a9ef5382c7a2d75336..10600f11c5810dac0c66c4b6a202a5f62741a143 100755 (executable)
@@ -1,12 +1,22 @@
 #!/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
old mode 100644 (file)
new mode 100755 (executable)
index 79ec5b8..326942a
 
 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
@@ -31,6 +33,6 @@ 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
old mode 100644 (file)
new mode 100755 (executable)
index 88fe675..b9338ef
 
 
 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
old mode 100644 (file)
new mode 100755 (executable)
index 7e389c9..dd36354
 
 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
index 15d794429408e60c8ebd4615beef850bac78868f..0101e2c7644009901f1df4d662999fcbab991e6e 100755 (executable)
@@ -2,5 +2,7 @@
 
 
 systemctl disable NetworkManager-wait-online.service
+systemctl disable crond.service
+systemctl disable postfix.service
 
 systemctl disable logrotate.timer
diff --git a/sources/pgs.in/c3d/postinstall/scripts/20_setupcrontab.sh b/sources/pgs.in/c3d/postinstall/scripts/20_setupcrontab.sh
deleted file mode 100755 (executable)
index 033b8b4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-
-echo '10 2 * * * postgresql /usr/local/bin/backup_postgresql.sh' >>/etc/crontab
index ba7cce9388d0e5f1de9aaece5b3c47a33ea99b70..175cb9021d6bf62e269b38d6fbe47b1859e0e915 100644 (file)
@@ -5,6 +5,8 @@ SPEC_PACKAGES="cronie \
                glibc-langpack-en \
                glibc-langpack-hu \
                glibc-locale-source \
-               postgresql-server \
+               man-db \
                openssh-clients \
-               openssh-server"
+               openssh-server \
+               postfix \
+               postgresql-server"