From cd4a7177d7960b35059cce18d213a528b9ca6113 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Mon, 5 May 2025 16:53:09 +0300 Subject: [PATCH] Outline: configure backups --- files/backups/backup-all.sh.j2 | 8 +++++++- files/outline/backup.sh.j2 | 25 +++++++++++++++++++++++++ files/outline/docker-compose.yml.j2 | 5 +---- playbook-outline.yml | 23 +++++++++++++++++++++-- 4 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 files/outline/backup.sh.j2 diff --git a/files/backups/backup-all.sh.j2 b/files/backups/backup-all.sh.j2 index 024f539..3a5ee61 100644 --- a/files/backups/backup-all.sh.j2 +++ b/files/backups/backup-all.sh.j2 @@ -8,6 +8,11 @@ echo "Backup: perform gitea backup" su --login gitea --command '/home/gitea/backup.sh' +echo "Backup: perform outline backup" + +su --login outline --command '/home/outline/backup.sh' + + echo "Backup: perform gramps backup" su --login {{ primary_user }} --command '/home/{{ primary_user }}/applications/gramps/backup.sh' @@ -15,7 +20,7 @@ su --login {{ primary_user }} --command '/home/{{ primary_user }}/applications/g echo "Backup: send backups to remote storage with retic" -restic-shell.sh backup --verbose /home/gitea/backups /home/major/applications/gramps/backups \ +restic-shell.sh backup --verbose /home/gitea/backups /home/outline/backups /home/major/applications/gramps/backups \ && restic-shell.sh check \ && restic-shell.sh forget --compact --prune --keep-daily 90 --keep-monthly 36 \ && restic-shell.sh check @@ -28,4 +33,5 @@ curl -s -X POST 'https://api.telegram.org/bot{{ notifications_tg_bot_token }}/se -d 'parse_mode=HTML' \ -d 'text={{ notifications_name }}: бекап успешно завершен!' + echo -e "\nBackup: done" diff --git a/files/outline/backup.sh.j2 b/files/outline/backup.sh.j2 new file mode 100644 index 0000000..ff6fb71 --- /dev/null +++ b/files/outline/backup.sh.j2 @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -eu +set -o pipefail + +TIMESTAMP=$(date +%Y%m%d_%H%M%S) +BACKUP_FILE="outline_postgres_${TIMESTAMP}.sql.gz" + +echo "Outline: backing up PostgreSQL database" + +docker compose --file "{{ base_dir }}/docker-compose.yml" exec \ + outline_postgres \ + pg_dump \ + -U "{{ outline_postgres_user }}" \ + "{{ outline_postgres_database }}" \ + | gzip > "{{ postgres_backups_dir }}/${BACKUP_FILE}" + +echo "Outline: PostgreSQL backup saved to {{ postgres_backups_dir }}/${BACKUP_FILE}" + +echo "Outline: removing old backups" + +# Keep only the 3 most recent backups +keep-files.py "{{ postgres_backups_dir }}" --keep 3 + +echo "Outline: backup completed successfully." diff --git a/files/outline/docker-compose.yml.j2 b/files/outline/docker-compose.yml.j2 index fec773a..6897eb3 100644 --- a/files/outline/docker-compose.yml.j2 +++ b/files/outline/docker-compose.yml.j2 @@ -58,11 +58,8 @@ services: container_name: outline_postgres restart: unless-stopped volumes: - - ./data/postgres:/var/lib/postgresql/data + - {{ postgres_data_dir }}:/var/lib/postgresql/data environment: POSTGRES_USER: '{{ outline_postgres_user }}' POSTGRES_PASSWORD: '{{ outline_postgres_password }}' POSTGRES_DB: '{{ outline_postgres_database }}' - -volumes: - database-data: diff --git a/playbook-outline.yml b/playbook-outline.yml index bd8a0b8..aeb1b08 100644 --- a/playbook-outline.yml +++ b/playbook-outline.yml @@ -11,7 +11,8 @@ app_user: "{{ app_name }}" base_dir: "/home/{{ app_name }}" data_dir: "{{ (base_dir, 'data') | path_join }}" - backups_dir: "{{ (base_dir, 'backups') | path_join }}" + postgres_data_dir: "{{ (base_dir, 'data', 'postgres') | path_join }}" + postgres_backups_dir: "{{ (base_dir, 'backups', 'postgres') | path_join }}" tasks: - name: "Create user and environment" @@ -31,13 +32,31 @@ USER_UID: "{{ user_create_result.uid }}" USER_GID: "{{ user_create_result.group }}" + - name: "Create internal directories" + ansible.builtin.file: + path: "{{ item }}" + state: "directory" + owner: "{{ app_user }}" + group: "{{ app_user }}" + mode: "0770" + loop: + - "{{ postgres_backups_dir }}" + - name: "Copy docker compose file" ansible.builtin.template: src: "./files/{{ app_name }}/docker-compose.yml.j2" dest: "{{ base_dir }}/docker-compose.yml" owner: "{{ app_user }}" group: "{{ app_user }}" - mode: "0644" + mode: "0640" + + - name: "Copy backup script" + ansible.builtin.template: + src: "./files/{{ app_name }}/backup.sh.j2" + dest: "{{ base_dir }}/backup.sh" + owner: "{{ app_user }}" + group: "{{ app_user }}" + mode: "0750" - name: "Run application with docker compose" community.docker.docker_compose_v2: