Files
gochat/scripts/db_backup.sh
T
2026-06-04 15:44:48 +08:00

39 lines
1.4 KiB
Bash
Executable File

#!/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
}