#!/bin/bash # GoChat Database Backup Script # Reference: Chatwoot uses pg_dump for backup in production deployments # Usage: ./scripts/db_backup.sh [env] set -euo pipefail ENV="${1:-production}" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="${GOCHAT_BACKUP_DIR:-/var/backups/gochat}" DB_NAME="${POSTGRES_DB:-gochat_production}" DB_USER="${POSTGRES_USER:-gochat}" DB_HOST="${POSTGRES_HOST:-localhost}" DB_PORT="${POSTGRES_PORT:-5432}" RETENTION_DAYS="${GOCHAT_BACKUP_RETENTION_DAYS:-30}" mkdir -p "${BACKUP_DIR}" BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.sql.gz" echo "[$(date)] Starting backup of ${DB_NAME} on ${DB_HOST}:${DB_PORT}" # pg_dump with compression — mirrors Chatwoot backup approach PGPASSWORD="${POSTGRES_PASSWORD}" pg_dump -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" --format=custom --compress=9 | gzip > "${BACKUP_FILE}" BACKUP_SIZE=$(du -h "${BACKUP_FILE}" | cut -f1) echo "[$(date)] Backup complete: ${BACKUP_FILE} (${BACKUP_SIZE})" # Prune old backups beyond retention period find "${BACKUP_DIR}" -name "*.sql.gz" -mtime +"${RETENTION_DAYS}" -delete echo "[$(date)] Pruned backups older than ${RETENTION_DAYS} days" # Verify backup integrity gunzip -t "${BACKUP_FILE}" && echo "[$(date)] Backup integrity verified" || { echo "[$(date)] ERROR: Backup integrity check failed!" rm -f "${BACKUP_FILE}" exit 1 }