diff --git a/base/pgbackrest/pgbackrest-diff@.service b/base/pgbackrest/pgbackrest-diff@.service new file mode 100644 index 0000000..10162a6 --- /dev/null +++ b/base/pgbackrest/pgbackrest-diff@.service @@ -0,0 +1,15 @@ +[Unit] +Description=pgbackrest backup diff for %i +Documentation=https://pgbackrest.org/configuration.html +Documentation=man:pgbackrest(1) man:pgbackrest.conf(5) +ConditionACPower=true +PartOf=pgbackrest.target + +[Service] +Type=oneshot +User=postgres +Group=postgres +ExecStart=/usr/bin/pgbackrest --log-level-console=info --stanza=%i --type=diff backup +# Give a reasonable amount of time for job to finish +TimeoutSec=7200 + diff --git a/base/pgbackrest/pgbackrest-diff@.timer b/base/pgbackrest/pgbackrest-diff@.timer new file mode 100644 index 0000000..9bf2da5 --- /dev/null +++ b/base/pgbackrest/pgbackrest-diff@.timer @@ -0,0 +1,14 @@ +[Unit] +Description=Weekly pgbackrest diff backup (wed) +Documentation=https://pgbackrest.org/configuration.html +Documentation=man:pgbackrest(1) man:pgbackrest.conf(5) +PartOf=pgbackrest.target + +[Timer] +#OnCalendar=Sun *-*-8..31 05:05:05 +OnCalendar=Wed *-*-* 05:05:05 +AccuracySec=1h +Persistent=true + +[Install] +WantedBy=timers.target diff --git a/base/pgbackrest/pgbackrest-full@.service b/base/pgbackrest/pgbackrest-full@.service new file mode 100644 index 0000000..d50a09e --- /dev/null +++ b/base/pgbackrest/pgbackrest-full@.service @@ -0,0 +1,15 @@ +[Unit] +Description=pgbackrest backup full for %i +Documentation=https://pgbackrest.org/configuration.html +Documentation=man:pgbackrest(1) man:pgbackrest.conf(5) +ConditionACPower=true +PartOf=pgbackrest.target + +[Service] +Type=oneshot +User=postgres +Group=postgres +ExecStart=/usr/bin/pgbackrest --log-level-console=info --stanza=%i --type=full backup +# Give a reasonable amount of time for the job to run before timeout +TimeoutSec=7200 + diff --git a/base/pgbackrest/pgbackrest-full@.timer b/base/pgbackrest/pgbackrest-full@.timer new file mode 100644 index 0000000..af21077 --- /dev/null +++ b/base/pgbackrest/pgbackrest-full@.timer @@ -0,0 +1,14 @@ +[Unit] +Description=Monthly pgbackrest full backup (1st sun) +Documentation=https://pgbackrest.org/configuration.html +Documentation=man:pgbackrest(1) man:pgbackrest.conf(5) +PartOf=pgbackrest.target + +[Timer] +#OnCalendar=Sun *-*-1..7 05:05:05 +OnCalendar=Sun *-*-* 05:05:05 +AccuracySec=1h +Persistent=true + +[Install] +WantedBy=timers.target diff --git a/base/pgbackrest/pgbackrest-incr@.service b/base/pgbackrest/pgbackrest-incr@.service new file mode 100644 index 0000000..bdff31b --- /dev/null +++ b/base/pgbackrest/pgbackrest-incr@.service @@ -0,0 +1,15 @@ +[Unit] +Description=pgbackrest backup incremental for %i +Documentation=https://pgbackrest.org/configuration.html +Documentation=man:pgbackrest(1) man:pgbackrest.conf(5) +ConditionACPower=true +PartOf=pgbackrest.target + +[Service] +Type=oneshot +User=postgres +Group=postgres +ExecStart=/usr/bin/pgbackrest --log-level-console=info --stanza=%i --type=incr backup +# Give a reasonable amount of time for the job to finish +TimeoutSec=7200 + diff --git a/base/pgbackrest/pgbackrest-incr@.timer b/base/pgbackrest/pgbackrest-incr@.timer new file mode 100644 index 0000000..ee5169d --- /dev/null +++ b/base/pgbackrest/pgbackrest-incr@.timer @@ -0,0 +1,13 @@ +[Unit] +Description=Daily pgbackrest incremental backup (mon-sat) +Documentation=https://pgbackrest.org/configuration.html +Documentation=man:pgbackrest(1) man:pgbackrest.conf(5) +PartOf=pgbackrest.target + +[Timer] +OnCalendar=Mon..Sat *-*-* 05:05:05 +AccuracySec=1h +Persistent=true + +[Install] +WantedBy=timers.target diff --git a/base/pgbackrest/pgbackrest.conf b/base/pgbackrest/pgbackrest.conf new file mode 100644 index 0000000..6856d66 --- /dev/null +++ b/base/pgbackrest/pgbackrest.conf @@ -0,0 +1,5 @@ +[global] +repo-path=/var/lib/pgbackrest + +#[main] +#pg-path=/var/lib/pgsql/data diff --git a/base/pgbackrest/pgbackrest.service b/base/pgbackrest/pgbackrest.service new file mode 100644 index 0000000..d3c32a7 --- /dev/null +++ b/base/pgbackrest/pgbackrest.service @@ -0,0 +1,18 @@ +[Unit] +Description=pgBackRest Server +Documentation=https://pgbackrest.org/configuration.html +Documentation=man:pgbackrest(1) man:pgbackrest.conf(5) +After=network.target +StartLimitIntervalSec=0 +PartOf=pgbackrest.target + +[Service] +Type=simple +Restart=always +RestartSec=1 +User=postgres +ExecStart=/usr/bin/pgbackrest server +ExecReload=kill -HUP $MAINPID + +[Install] +WantedBy=multi-user.target diff --git a/base/pgbackrest/pgbackrest.spec b/base/pgbackrest/pgbackrest.spec new file mode 100644 index 0000000..08ffcdf --- /dev/null +++ b/base/pgbackrest/pgbackrest.spec @@ -0,0 +1,135 @@ + +%define services pgbackrest.target pgbackrest-diff@.service pgbackrest-full@.service pgbackrest-incr@.service pgbackrest.service pgbackrest-diff@.timer pgbackrest-full@.timer pgbackrest-incr@.timer + +Name: pgbackrest +Version: 2.54.2 +Release: 1%{dist} +Summary: Reliable PostgreSQL Backup & Restore +License: MIT +URL: https://www.pgbackrest.org +Source: https://github.com/%{name}/%{name}/archive/release/%{version}/%{name}-%{version}.tar.gz + +Source1: pgbackrest.conf +Source10: pgbackrest-diff@.service +Source11: pgbackrest-diff@.timer +Source12: pgbackrest-full@.service +Source13: pgbackrest-full@.timer +Source14: pgbackrest-incr@.service +Source15: pgbackrest-incr@.timer +Source16: pgbackrest.service +Source17: pgbackrest.target +Source18: pgbackrest.tmpfiles.d + +Patch1: use-run-pgbackrest.patch + +BuildRequires: libyaml-devel +BuildRequires: meson +BuildRequires: pkgconfig +BuildRequires: pkgconfig(libpq) +BuildRequires: pkgconfig(bzip2) +BuildRequires: pkgconfig(liblz4) +BuildRequires: pkgconfig(libpq) +BuildRequires: pkgconfig(libssh2) +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: pkgconfig(openssl) +BuildRequires: pkgconfig(systemd) +BuildRequires: pkgconfig(libzstd) + +# This is a bit awkward as we only need this for directory ownership +Requires(pre): postgresql-server + +%description +pgBackRest aims to be a simple, reliable backup and restore system for +PostgreSQL that can seamlessly scale up to the largest databases and +workloads. + +The following features are available: +- Parallel backup & restore +- Local or remote operation +- Full, incremental, differential backups +- Backup rotation & archive expiration +- Backup integrity +- Page checksums +- Backup resume +- Streaming compression & checksums +- Delta restore +- Parallel, asynchronous WAL push & get +- Tablespace & link support +- Amazon S3 support +- Encryption +- Compatibility with PostgreSQL >= 8.3 + +%prep +%autosetup -p1 -n %{name}-release-%{version} + +%build + +%meson +%meson_build + +%install +%meson_install + +install -D -d -m 0700 \ + %{buildroot}%{_localstatedir}/lib/%{name} \ + %{buildroot}%{_localstatedir}/log/%{name} \ + %{buildroot}%{_localstatedir}/spool/%{name} + +install -D -d -m 0755 \ + %{buildroot}%{_sysconfdir} \ + %{buildroot}%{_unitdir} + +install -m 0644 %{SOURCE1} %{buildroot}/%{_sysconfdir}/%{name}.conf +install -m 0644 \ + %{SOURCE10} \ + %{SOURCE11} \ + %{SOURCE12} \ + %{SOURCE13} \ + %{SOURCE14} \ + %{SOURCE15} \ + %{SOURCE16} \ + %{SOURCE17} \ + %{buildroot}%{_unitdir} + +install -D -m 0644 \ + %{SOURCE18} \ + %{buildroot}%{_tmpfilesdir}/%{name}.conf + +%check +# Tests are only available with Vagrant +# We just test that the binary works. +%{buildroot}/%{_bindir}/%{name} version || exit 1 +%meson_test + +%pre +%systemd_pre %{services} + +%post +%tmpfiles_create %{_tmpfilesdir}/%{name}.conf +%systemd_post %{services} + +%preun +%systemd_preun %{services} + +%postun +%systemd_postun %{services} + +%files +%doc README.md +%license LICENSE +%config(noreplace) %attr (640,root,postgres) %{_sysconfdir}/%{name}.conf +# We still can do that as postgres user is system fixed +%attr(-,postgres,postgres) %{_localstatedir}/log/%{name} +%attr(-,postgres,postgres) %{_localstatedir}/lib/%{name} +%attr(-,postgres,postgres) %{_localstatedir}/spool/%{name} +%ghost %dir %attr(750,postgres,postgres) /run/pgbackrest +%{_bindir}/%{name} +%{_unitdir}/pgbackrest-diff@.service +%{_unitdir}/pgbackrest-diff@.timer +%{_unitdir}/pgbackrest-full@.service +%{_unitdir}/pgbackrest-full@.timer +%{_unitdir}/pgbackrest-incr@.service +%{_unitdir}/pgbackrest-incr@.timer +%{_unitdir}/pgbackrest.service +%{_unitdir}/pgbackrest.target +%{_tmpfilesdir}/%{name}.conf diff --git a/base/pgbackrest/pgbackrest.target b/base/pgbackrest/pgbackrest.target new file mode 100644 index 0000000..0ddd8e9 --- /dev/null +++ b/base/pgbackrest/pgbackrest.target @@ -0,0 +1,3 @@ +[Unit] +Description=Target to restart/stop all parts of pgbackrest + diff --git a/base/pgbackrest/pgbackrest.tmpfiles.d b/base/pgbackrest/pgbackrest.tmpfiles.d new file mode 100644 index 0000000..650af5e --- /dev/null +++ b/base/pgbackrest/pgbackrest.tmpfiles.d @@ -0,0 +1,2 @@ +# Type Path Mode UID GID Age Argument +d /run/pgbackrest 0750 postgres postgres - - diff --git a/base/pgbackrest/use-run-pgbackrest.patch b/base/pgbackrest/use-run-pgbackrest.patch new file mode 100644 index 0000000..5e0f3d3 --- /dev/null +++ b/base/pgbackrest/use-run-pgbackrest.patch @@ -0,0 +1,169 @@ +Index: pgbackrest-release-2.54.1/CODING.md +=================================================================== +--- pgbackrest-release-2.54.1.orig/CODING.md ++++ pgbackrest-release-2.54.1/CODING.md +@@ -268,11 +268,11 @@ Continuation characters should be aligne + + This function can be called without variable parameters: + ```c +-storagePathCreateP(storageLocal(), "/tmp/pgbackrest"); ++storagePathCreateP(storageLocal(), "/run/pgbackrest"); + ``` + Or with variable parameters: + ```c +-storagePathCreateP(storageLocal(), "/tmp/pgbackrest", .errorOnExists = true, .mode = 0777); ++storagePathCreateP(storageLocal(), "/run/pgbackrest", .errorOnExists = true, .mode = 0777); + ``` + If the majority of functions in a module or object are variadic it is best to provide macros for all functions even if they do not have variable parameters. Do not use the base function when variadic macros exist. + +Index: pgbackrest-release-2.54.1/doc/resource/git-history.cache +=================================================================== +--- pgbackrest-release-2.54.1.orig/doc/resource/git-history.cache ++++ pgbackrest-release-2.54.1/doc/resource/git-history.cache +@@ -8433,7 +8433,7 @@ + { + "commit": "a1365b26d4c2383eaacea3714eeb521435ca79aa", + "date": "2021-01-18 23:41:09 -0500", +- "subject": "Remove duplicate mkdir for /tmp/pgbackrest in Vagrantfile." ++ "subject": "Remove duplicate mkdir for /run/pgbackrest in Vagrantfile." + }, + { + "commit": "8322dfd7af97e307b952cfb37e6a65b65f55be0f", +@@ -11249,8 +11249,8 @@ + { + "commit": "3fbfcba811499a59b943dd893eef9ff52090f7b6", + "date": "2020-03-16 17:27:01 -0400", +- "subject": "Forbid access to /tmp/pgbackrest in the Vagrantfile.", +- "body": "This matches the error that will be thrown in the vm=none test on Travis CI if a unit test writes to /tmp/pgbackrest." ++ "subject": "Forbid access to /run/pgbackrest in the Vagrantfile.", ++ "body": "This matches the error that will be thrown in the vm=none test on Travis CI if a unit test writes to /run/pgbackrest." + }, + { + "commit": "46911c64c19dc8ff76d2a6ff4548fc01647043e0", +@@ -13150,7 +13150,7 @@ + "commit": "45881c74aeff4bb25559ec0254fa7fc1960d9cab", + "date": "2019-10-08 12:06:30 -0400", + "subject": "Allow most unit tests to run outside of a container.", +- "body": "Three major changes were required to get this working:\n\n1) Provide the path to pgbackrest in the build directory when running outside a container. Tests in a container will continue to install and run against /usr/bin/pgbackrest.\n\n1) Set a per-test lock path so tests don't conflict on the default /tmp/pgbackrest path. Also set a per-test log-path while we are at it.\n\n2) Use localhost instead of a custom host for TLS test connections. Tests in containers will continue to update /etc/hosts and use the custom host.\n\nAdd infrastructure and update harnessCfgLoad*() to get the correct exe and paths loaded for testing.\n\nSince new tests are required to verify that running outside a container works, also rework the tests in Travis CI to provide coverage within a reasonable amount of time. Mainly, break up to doc tests by VM and run an abbreviated unit test suite on co6 and co7." ++ "body": "Three major changes were required to get this working:\n\n1) Provide the path to pgbackrest in the build directory when running outside a container. Tests in a container will continue to install and run against /usr/bin/pgbackrest.\n\n1) Set a per-test lock path so tests don't conflict on the default /run/pgbackrest path. Also set a per-test log-path while we are at it.\n\n2) Use localhost instead of a custom host for TLS test connections. Tests in containers will continue to update /etc/hosts and use the custom host.\n\nAdd infrastructure and update harnessCfgLoad*() to get the correct exe and paths loaded for testing.\n\nSince new tests are required to verify that running outside a container works, also rework the tests in Travis CI to provide coverage within a reasonable amount of time. Mainly, break up to doc tests by VM and run an abbreviated unit test suite on co6 and co7." + }, + { + "commit": "77b0c6c993a0e6ff45a6a99f343c3709a016d152", +@@ -21637,7 +21637,7 @@ + "commit": "18fd25233b1db7b3197f5d8dc537d239dcfc7aba", + "date": "2016-04-14 09:30:54 -0400", + "subject": "New simpler configuration and consistent project/exe/path naming.", +- "body": "* The repo-path option now always refers to the repository where backups and archive are stored, whether local or remote, so the repo-remote-path option has been removed. The new spool-path option can be used to define a location for queueing WAL segments when archiving asynchronously. Otherwise, a local repository is no longer required.\n\n* Implemented a new config format which should be far simpler to use. See the User Guide and Configuration Reference for details but for a simple configuration all options can now be placed in the stanza section. Options that are shared between stanzas can be placed in the [global] section. More complex configurations can still make use of command sections though this should be a rare use case.\n\n* The default configuration filename is now pgbackrest.conf instead of pg_backrest.conf. This was done for consistency with other naming changes but also to prevent old config files from being loaded accidentally.\n\n* The default repository name was changed from /var/lib/backup to /var/lib/pgbackrest.\n\n* Lock files are now stored in /tmp/pgbackrest by default. These days /run/pgbackrest would be the preferred location but that would require init scripts which are not part of this release. The lock-path option can be used to configure the lock directory.\n\n* Log files are now stored in /var/log/pgbackrest by default and no longer have the date appended so they can be managed with logrotate. The log-path option can be used to configure the lock directory.\n\n* Executable filename changed from pg_backrest to pgbackrest." ++ "body": "* The repo-path option now always refers to the repository where backups and archive are stored, whether local or remote, so the repo-remote-path option has been removed. The new spool-path option can be used to define a location for queueing WAL segments when archiving asynchronously. Otherwise, a local repository is no longer required.\n\n* Implemented a new config format which should be far simpler to use. See the User Guide and Configuration Reference for details but for a simple configuration all options can now be placed in the stanza section. Options that are shared between stanzas can be placed in the [global] section. More complex configurations can still make use of command sections though this should be a rare use case.\n\n* The default configuration filename is now pgbackrest.conf instead of pg_backrest.conf. This was done for consistency with other naming changes but also to prevent old config files from being loaded accidentally.\n\n* The default repository name was changed from /var/lib/backup to /var/lib/pgbackrest.\n\n* Lock files are now stored in /run/pgbackrest by default. These days /run/pgbackrest would be the preferred location but that would require init scripts which are not part of this release. The lock-path option can be used to configure the lock directory.\n\n* Log files are now stored in /var/log/pgbackrest by default and no longer have the date appended so they can be managed with logrotate. The log-path option can be used to configure the lock directory.\n\n* Executable filename changed from pg_backrest to pgbackrest." + }, + { + "commit": "885797e4b58a675487a3531ba16908c1d1e9f970", +Index: pgbackrest-release-2.54.1/doc/xml/coding.xml +=================================================================== +--- pgbackrest-release-2.54.1.orig/doc/xml/coding.xml ++++ pgbackrest-release-2.54.1/doc/xml/coding.xml +@@ -365,13 +365,13 @@ void storagePathCreate(const Storage *th +
This function can be called without variable parameters:
+ +Or with variable parameters:
+ +If the majority of functions in a module or object are variadic it is best to provide macros for all functions even if they do not have variable parameters. Do not use the base function when variadic macros exist.
+Index: pgbackrest-release-2.54.1/doc/xml/release/2016/1.00.xml +=================================================================== +--- pgbackrest-release-2.54.1.orig/doc/xml/release/2016/1.00.xml ++++ pgbackrest-release-2.54.1/doc/xml/release/2016/1.00.xml +@@ -43,7 +43,7 @@ +Lock files are now stored in
Lock files are now stored in