Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • radoslav_bodo/rwm
1 result
Show changes
Commits on Source (5)
...@@ -33,7 +33,7 @@ microceph-service: ...@@ -33,7 +33,7 @@ microceph-service:
snap install microceph snap install microceph
snap refresh --hold microceph snap refresh --hold microceph
/snap/bin/microceph cluster bootstrap /snap/bin/microceph cluster bootstrap
/snap/bin/microceph disk add loop,1G,3 /snap/bin/microceph disk add loop,4G,3
/snap/bin/microceph enable rgw /snap/bin/microceph enable rgw
while true; do /snap/bin/ceph status | grep "HEALTH_OK" && break; done while true; do /snap/bin/ceph status | grep "HEALTH_OK" && break; done
# required for gitlab runner shell executor which runs as non-privileged user # required for gitlab runner shell executor which runs as non-privileged user
......
...@@ -141,6 +141,15 @@ rwm restic snapshots ...@@ -141,6 +141,15 @@ rwm restic snapshots
rwm restic mount /mnt/restore rwm restic mount /mnt/restore
``` ```
### Restore PostgreSQL backup
```
# Using script for the whole archive
scripts/restore_postgresql.sh postgresql.tar.gz
# For individual dumps
createdb database_name && gunzip -c database_name.sql.gz | psql -d database_name
```
## Notes ## Notes
......
...@@ -31,6 +31,16 @@ backups: ...@@ -31,6 +31,16 @@ backups:
postrun: postrun:
- "/opt/rwm/scripts/backup_mysql.py cleanup" - "/opt/rwm/scripts/backup_mysql.py cleanup"
postgresql:
filesdirs:
- /var/lib/rwm/postgresql.tar.gz
tags:
- "postgresql"
prerun:
- "/opt/rwm/scripts/backup_postgresql.py create"
postrun:
- "/opt/rwm/scripts/backup_postgresql.py cleanup"
retention: retention:
keep-daily: "60" keep-daily: "60"
keep-within: "60d" keep-within: "60d"
......
...@@ -94,6 +94,7 @@ def cleanup(): ...@@ -94,6 +94,7 @@ def cleanup():
return os.unlink(ARCHIVE) return os.unlink(ARCHIVE)
# pylint: disable=duplicate-code
def main(): def main():
"""main""" """main"""
......
#!/bin/bash
# example dockerized backup of dockerized postgresql
set -e
umask 077
# note: Alternatively, this can be placed in the rwm backup.prerun configuration field.
docker exec -u postgres pgdocker pg_dumpall --clean > /var/backups/pgdocker.sql
docker run \
--rm \
--pull always \
--volume "/etc/rwm.conf:/opt/rwm/rwm.conf:ro" \
--volume "/var/backups:/var/backups" \
--volume "/var/run:/var/run" \
--hostname "pgdocker-rwm-container" \
"gitlab-registry.cesnet.cz/radoslav_bodo/rwm:release-1.1" \
backup pgdocker
# note: dtto
rm -f /var/backups/pgdocker.sql
\ No newline at end of file
#!/usr/bin/env python3
"""rwm postgresql backup helper"""
import os
import shutil
import subprocess
import sys
from argparse import ArgumentParser
BASE = "/var/lib/rwm"
BACKUPDIR = f"{BASE}/postgresql"
ARCHIVE = f"{BASE}/postgresql.tar.gz"
USERNAME = os.environ.get("PGUSER", "postgres")
def list_databases():
"""list postgresql databases"""
cmd = [
"su",
"-c",
'psql -q -A -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;"',
USERNAME,
]
proc = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, text=True)
return proc.stdout.splitlines()
def backup_database(database):
"""backup single database"""
cmd = ["su", "-c", f"pg_dump --clean --create {database}", USERNAME]
try:
with open(f"{BACKUPDIR}/{database}.sql", "wb") as fd:
subprocess.run(cmd, stdout=fd, check=True)
except subprocess.CalledProcessError:
print(f"ERROR: cannot dump {database}", file=sys.stderr)
return 1
return 0
def backup_global_data():
"""backup global data"""
try:
cmd = ["su", "-c", "pg_dumpall --clean --globals-only", USERNAME]
with open(f"{BACKUPDIR}/_globals.sql", "wb") as fd:
subprocess.run(cmd, stdout=fd, check=True)
except subprocess.CalledProcessError:
print("ERROR: cannot dump database global data", file=sys.stderr)
return 1
return 0
def create():
"""dump database to archive"""
databases = 0
errors = 0
shutil.rmtree(BACKUPDIR, ignore_errors=True)
os.makedirs(BACKUPDIR, exist_ok=True)
for db in list_databases():
databases += 1
errors += backup_database(db)
errors += backup_global_data()
subprocess.run(["tar", "czf", ARCHIVE, BACKUPDIR], check=True)
shutil.rmtree(BACKUPDIR)
print("archive created:")
subprocess.run(["ls", "-l", ARCHIVE], check=True)
if databases == 0:
print("ERROR: no databases dumped", file=sys.stderr)
errors += 1
print(f"RESULT: errors={errors} databases={databases}")
return errors
def cleanup():
"""cleanup backup process"""
return os.unlink(ARCHIVE)
# pylint: disable=duplicate-code
def main():
"""main"""
parser = ArgumentParser()
parser.add_argument("command", choices=["create", "cleanup"])
args = parser.parse_args()
os.umask(0o077)
if args.command == "create":
return create()
if args.command == "cleanup":
return cleanup()
return 1
if __name__ == "__main__":
sys.exit(main())
...@@ -15,7 +15,7 @@ else ...@@ -15,7 +15,7 @@ else
RESULT="ERROR" RESULT="ERROR"
fi fi
# shellcheck disable=SC2002 # shellcheck disable=SC2002
cat "$LOGFILE" | mail -E -s "rwm backup-all $RESULT" $USER cat "$LOGFILE" | mail -E -s "rwm backup-all $RESULT" "$LOGNAME"
find /var/log/rwm -type f -mtime +90 -exec rm {} \; find /var/log/rwm -type f -mtime +90 -exec rm {} \;
......
#!/bin/bash
set -ex
umask 077
tar_file="$1"
temp_dir=$(mktemp -d)
tar xzf "$tar_file" -C "$temp_dir"
chown -R postgres "${temp_dir}"
find "$temp_dir" -type f -name '*.sql' | while read -r dump_file; do
su -c "psql < '$dump_file'" postgres
done
rm -rf "$temp_dir"
\ No newline at end of file