Files
deployment-scripts/backup-mattermost.sh

67 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# ==============================================================================
# Mattermost Backup Script
# ==============================================================================
# Hot backup (default): pg_dump while containers stay up.
# Cold backup (--cold): stops containers, tars data, restarts.
#
# Usage: backup-mattermost.sh
# backup-mattermost.sh --cold
# ==============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
parse_args "$@"
SERVICE_NAME="mattermost"
BASE_DIR="/opt/${SERVICE_NAME}"
CONFIG_NAME="${SERVICE_NAME}"
BACKUP_DIR="/opt/backup"
STAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP_FILE="${BACKUP_DIR}/backup-${SERVICE_NAME}-${STAMP}.tar.gz"
[[ -d "$BASE_DIR" ]] || fatal "Mattermost is not deployed at ${BASE_DIR}."
mkdir -p "$BACKUP_DIR"
# --- Hot backup: pg_dump ---
if [[ "$ARG_COLD" != "1" ]]; then
info "Running hot backup (containers stay up)..."
info "Running pg_dump..."
docker exec mm-postgres pg_dump -U mmuser -d mattermost \
> "${BASE_DIR}/postgres/dump.sql" \
2>/dev/null || warn "pg_dump failed — archive will contain live data files only."
fi
# --- Cold backup: stop containers ---
if [[ "$ARG_COLD" == "1" ]]; then
info "Running cold backup (stopping containers)..."
(cd "$BASE_DIR" && docker compose down)
fi
# --- Create archive ---
info "Creating archive..."
tar czf "$BACKUP_FILE" -C / \
"opt/${SERVICE_NAME}" \
"opt/traefik/dynamic/${CONFIG_NAME}.yml" 2>/dev/null || \
tar czf "$BACKUP_FILE" -C / \
"opt/${SERVICE_NAME}"
# --- Cold: restart ---
if [[ "$ARG_COLD" == "1" ]]; then
(cd "$BASE_DIR" && docker compose up -d)
ok "Containers restarted."
fi
# --- Clean up dump ---
rm -f "${BASE_DIR}/postgres/dump.sql" 2>/dev/null
# --- Rotate old backups (keep last 5) ---
# shellcheck disable=SC2012
ls -t "${BACKUP_DIR}/backup-${SERVICE_NAME}-"*.tar.gz 2>/dev/null | tail -n +6 | xargs -r rm --
ok "Backup: ${BACKUP_FILE} ($(du -h "$BACKUP_FILE" | cut -f1))"