39 lines
1.4 KiB
Bash
Executable File
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
|
|
}
|