From 50b473527a927663c33cca016eb31e6e0dbcba1f Mon Sep 17 00:00:00 2001 From: andryyy Date: Mon, 18 Oct 2021 16:20:35 +0200 Subject: [PATCH] Add cold standby docs --- docs/b_n_r_accidental_deletion.md | 40 ------------- docs/b_n_r_backup.md | 97 ------------------------------- docs/b_n_r_restore.md | 14 ----- 3 files changed, 151 deletions(-) delete mode 100644 docs/b_n_r_accidental_deletion.md delete mode 100644 docs/b_n_r_backup.md delete mode 100644 docs/b_n_r_restore.md diff --git a/docs/b_n_r_accidental_deletion.md b/docs/b_n_r_accidental_deletion.md deleted file mode 100644 index 43b731f21..000000000 --- a/docs/b_n_r_accidental_deletion.md +++ /dev/null @@ -1,40 +0,0 @@ -So you deleted a mailbox and have no backups, he? - -If you noticed your mistake within a few hours, you can probably recover the users data. - -### SOGo - -We automatically create daily backups (24h interval starting from running up -d) in `/var/lib/docker/volumes/mailcowdockerized_sogo-userdata-backup-vol-1/_data/`. - -**Make sure the user you want to restore exists in your mailcow**. Re-create them if they are missing. - -Copy the file named after the user you want to restore to `__MAILCOW_DIRECTORY__/data/conf/sogo`. - -1\. Copy the backup: `cp /var/lib/docker/volumes/mailcowdockerized_sogo-userdata-backup-vol-1/_data/restoreme@example.org __MAILCOW_DIRECTORY__/data/conf/sogo` - -2\. Run `docker-compose exec -u sogo sogo-mailcow sogo-tool restore -F ALL /etc/sogo restoreme@example.org` - -Run `sogo-tool` without parameters to check for possible restore options. - -3\. Delete the copied backup by running `rm __MAILCOW_DIRECTORY__/data/conf/sogo` - -4\. Restart SOGo and Memcached: `docker-compose restart sogo-mailcow memcached-mailcow` - -### Mail - -In case of an accidental deletion of a mailbox, you will be able to recover for (by default) 5 days. This depends on the `MAILDIR_GC_TIME` parameter in `mailcow.conf`. - -A deleted mailbox is copied in its encrypted form to `/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/_garbage`. - -The folder inside _garbage follows the structure `[timestamp]_[domain_sanitized][user_sanitized]`, for example `1629109708_exampleorgtest in case of test@example.org deleted on 1629109708. - -To restore make sure you are actually restoring to the same mailcow it was deleted from or you use the same encryption keys in `crypt-vol-1`. - -**Make sure the user you want to restore exists in your mailcow**. Re-create them if they are missing. - -Copy the folders from `/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/_garbage/[timestamp]_[domain_sanitized][user_sanitized]` back to `/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/[domain]/[user]` and resync the folder and recalc the quota: - -``` -docker-compose exec dovecot-mailcow doveadm force-resync -u restoreme@example.net '*' -docker-compose exec dovecot-mailcow doveadm quota recalc -u restoreme@example.net -``` diff --git a/docs/b_n_r_backup.md b/docs/b_n_r_backup.md deleted file mode 100644 index 60e6c301e..000000000 --- a/docs/b_n_r_backup.md +++ /dev/null @@ -1,97 +0,0 @@ -### Backup - -#### Manual - -You can use the provided script `helper-scripts/backup_and_restore.sh` to backup mailcow automatically. - -Please do not copy this script to another location. - -To run a backup, write "backup" as first parameter and either one or more components to backup as following parameters. -You can also use "all" as second parameter to backup all components. Append `--delete-days n` to delete backups older than n days. - -``` -# Syntax: -# ./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days) - -# Backup all, delete backups older than 3 days -./helper-scripts/backup_and_restore.sh backup all --delete-days 3 - -# Backup vmail, crypt and mysql data, delete backups older than 30 days -./helper-scripts/backup_and_restore.sh backup vmail crypt mysql --delete-days 30 - -# Backup vmail -./helper-scripts/backup_and_restore.sh backup vmail - -``` - -The script will ask you for a backup location. Inside of this location it will create folders in the format "mailcow_DATE". -You should not rename those folders to not break the restore process. - -To run a backup unattended, define MAILCOW_BACKUP_LOCATION as environment variable before starting the script: - -``` -MAILCOW_BACKUP_LOCATION=/opt/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all -``` - -#### Cronjob - -You can run the backup script regularly via cronjob. Make sure `BACKUP_LOCATION` exists: - -``` -5 4 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/mnt/mailcow_backups /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3 -``` - -Per default cron sends the full result of each backup operation by email. If you want cron to only mail on error (non-zero exit code) you may want to use the following snippet. Pathes need to be modified according to your setup (this script is a user contribution). - -This following script may be placed in `/etc/cron.daily/mailcow-backup` - do not forget to mark it as executable via `chmod +x`: - -``` -#!/bin/sh - -# Backup mailcow data -# https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/ - -set -e - -OUT="$(mktemp)" -export MAILCOW_BACKUP_LOCATION="/opt/backup" -SCRIPT="/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh" -PARAMETERS="backup all" -OPTIONS="--delete-days 30" - -# run command -set +e -"${SCRIPT}" ${PARAMETERS} ${OPTIONS} 2>&1 > "$OUT" -RESULT=$? - -if [ $RESULT -ne 0 ] - then - echo "${SCRIPT} ${PARAMETERS} ${OPTIONS} encounters an error:" - echo "RESULT=$RESULT" - echo "STDOUT / STDERR:" - cat "$OUT" -fi -``` - -# Backup strategy with rsync and mailcow backup script - -Create the destination directory for mailcows helper script: -``` -mkdir -p /external_share/backups/backup_script -``` - -Create cronjobs: -``` -25 1 * * * rsync -aH --delete /opt/mailcow-dockerized /external_share/backups/mailcow-dockerized -40 2 * * * rsync -aH --delete /var/lib/docker/volumes /external_share/backups/var_lib_docker_volumes -5 4 * * * cd /opt/mailcow-dockerized/; BACKUP_LOCATION=/external_share/backups/backup_script /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3 -# If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path -``` - -On the destination (in this case `/external_share/backups`) you may want to have snapshot capabilities (ZFS, Btrfs etc.). Snapshot daily and keep for n days for a consistent backup. -Do **not** rsync to a Samba share, you need to keep the correct permissions! - -To restore you'd simply need to run rsync the other way round and restart Docker to re-read the volumes. Run `docker-compose pull` and `docker-compose up -d`. - -If you are lucky Redis and MariaDB can automatically fix the inconsistent databases (if they _are_ inconsistent). -In case of a corrupted database you'd need to use the helper script to restore the inconsistent elements. If a restore fails, try to extract the backups and copy the files back manually. Keep the file permissions! diff --git a/docs/b_n_r_restore.md b/docs/b_n_r_restore.md deleted file mode 100644 index e8603d86c..000000000 --- a/docs/b_n_r_restore.md +++ /dev/null @@ -1,14 +0,0 @@ -### Restore - -Please do not copy this script to another location. - -To run a restore, **start mailcow**, use the script with "restore" as first parameter. - -``` -# Syntax: -# ./helper-scripts/backup_and_restore.sh restore - -``` - -The script will ask you for a backup location containing the mailcow_DATE folders. -