Skip to main content

Backup Procedure

Complete backup procedures for Chatty AI deployment.

Overview

Chatty AI backup includes:

  • PostgreSQL database - User data, conversations, settings
  • Qdrant vector database - Document embeddings, RAG data
  • File uploads - User-uploaded documents
  • Configuration files - .env, docker-compose.yaml

Quick Backup Script

Download Backup Script

Save this script as backup-chatty.sh:

#!/bin/bash
#=================================================================
# Chatty AI Backup Script
# Creates full backup of all Chatty AI data
#=================================================================

set -e # Exit on error

# Configuration
BACKUP_DIR="${BACKUP_DIR:-/root/chatty-backups}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="chatty-backup-${TIMESTAMP}"
BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}"
COMPOSE_DIR="${COMPOSE_DIR:-/root/chatty-app-deploy/deploy}"

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${GREEN}==================================================================${NC}"
echo -e "${GREEN}Chatty AI Backup Script${NC}"
echo -e "${GREEN}==================================================================${NC}"
echo ""
echo "Backup directory: ${BACKUP_PATH}"
echo "Timestamp: ${TIMESTAMP}"
echo ""

# Create backup directory
mkdir -p "${BACKUP_PATH}"

# Navigate to compose directory
cd "${COMPOSE_DIR}"

echo -e "${YELLOW}[1/5] Backing up PostgreSQL database...${NC}"
docker compose exec -T db pg_dump -U chattyAdmin chattydb | gzip > "${BACKUP_PATH}/postgres-${TIMESTAMP}.sql.gz"
echo -e "${GREEN}✓ PostgreSQL backup complete${NC}"

echo -e "${YELLOW}[2/5] Backing up Qdrant vector database...${NC}"
docker compose stop qdrant
docker run --rm \
-v chatty-app_qdrant:/data \
-v "${BACKUP_PATH}":/backup \
ubuntu tar czf /backup/qdrant-${TIMESTAMP}.tar.gz /data
docker compose start qdrant
echo -e "${GREEN}✓ Qdrant backup complete${NC}"

echo -e "${YELLOW}[3/5] Backing up file uploads...${NC}"
docker run --rm \
-v chatty-app_chattyai:/data \
-v "${BACKUP_PATH}":/backup \
ubuntu tar czf /backup/uploads-${TIMESTAMP}.tar.gz /data/uploads
echo -e "${GREEN}✓ File uploads backup complete${NC}"

echo -e "${YELLOW}[4/5] Backing up configuration files...${NC}"
mkdir -p "${BACKUP_PATH}/config"
cp .env "${BACKUP_PATH}/config/.env" 2>/dev/null || echo "No .env file found"
cp docker-compose.yaml "${BACKUP_PATH}/config/docker-compose.yaml"
cp -r certs "${BACKUP_PATH}/config/" 2>/dev/null || echo "No certs directory found"
echo -e "${GREEN}✓ Configuration backup complete${NC}"

echo -e "${YELLOW}[5/5] Creating backup manifest...${NC}"
cat > "${BACKUP_PATH}/MANIFEST.txt" <<EOF
Chatty AI Backup
================
Backup Date: $(date)
Backup Name: ${BACKUP_NAME}
Hostname: $(hostname)

Contents:
- postgres-${TIMESTAMP}.sql.gz (PostgreSQL database)
- qdrant-${TIMESTAMP}.tar.gz (Qdrant vector database)
- uploads-${TIMESTAMP}.tar.gz (File uploads)
- config/.env (Environment variables)
- config/docker-compose.yaml (Compose configuration)
- config/certs/ (SSL certificates)

Restore Instructions:
See restore-chatty.sh script or documentation at:
https://docs.chatty-ai.ai/backup-restore/restore-procedure
EOF
echo -e "${GREEN}✓ Manifest created${NC}"

# Calculate backup size
BACKUP_SIZE=$(du -sh "${BACKUP_PATH}" | cut -f1)

echo ""
echo -e "${GREEN}==================================================================${NC}"
echo -e "${GREEN}Backup Complete!${NC}"
echo -e "${GREEN}==================================================================${NC}"
echo ""
echo "Backup location: ${BACKUP_PATH}"
echo "Backup size: ${BACKUP_SIZE}"
echo ""
echo "Files created:"
ls -lh "${BACKUP_PATH}"
echo ""
echo -e "${YELLOW}Next steps:${NC}"
echo "1. Verify backup integrity"
echo "2. Copy backup to secure off-site location"
echo "3. Test restore procedure periodically"
echo ""

Make Script Executable

chmod +x backup-chatty.sh

Run Backup

# Default backup location (/root/chatty-backups)
./backup-chatty.sh

# Custom backup location
BACKUP_DIR=/mnt/backups ./backup-chatty.sh

# Custom compose directory
COMPOSE_DIR=/path/to/deploy ./backup-chatty.sh

Manual Backup Steps

If you prefer manual backup:

1. Backup PostgreSQL Database

# Navigate to deploy directory
cd /root/chatty-app-deploy/deploy

# Create backup directory
mkdir -p ~/chatty-backups

# Backup database
docker compose exec db pg_dump -U chattyAdmin chattydb | gzip > ~/chatty-backups/postgres-$(date +%Y%m%d).sql.gz

# Verify backup
gunzip -c ~/chatty-backups/postgres-$(date +%Y%m%d).sql.gz | head -n 20

2. Backup Qdrant Vector Database

# Stop Qdrant
docker compose stop qdrant

# Backup Qdrant data
docker run --rm \
-v chatty-app_qdrant:/data \
-v ~/chatty-backups:/backup \
ubuntu tar czf /backup/qdrant-$(date +%Y%m%d).tar.gz /data

# Start Qdrant
docker compose start qdrant

# Verify backup
ls -lh ~/chatty-backups/qdrant-*.tar.gz

3. Backup File Uploads

# Backup uploads
docker run --rm \
-v chatty-app_chattyai:/data \
-v ~/chatty-backups:/backup \
ubuntu tar czf /backup/uploads-$(date +%Y%m%d).tar.gz /data/uploads

# Verify backup
ls -lh ~/chatty-backups/uploads-*.tar.gz

4. Backup Configuration

# Create config backup directory
mkdir -p ~/chatty-backups/config

# Backup .env file
cp .env ~/chatty-backups/config/.env

# Backup docker-compose
cp docker-compose.yaml ~/chatty-backups/config/

# Backup SSL certificates
cp -r certs ~/chatty-backups/config/

# Verify
ls -la ~/chatty-backups/config/

Automated Backup with Cron

Create Cron Job

# Edit crontab
crontab -e

# Add daily backup at 2 AM
0 2 * * * /root/backup-chatty.sh >> /var/log/chatty-backup.log 2>&1

# Add weekly backup on Sunday at 3 AM
0 3 * * 0 /root/backup-chatty.sh >> /var/log/chatty-backup-weekly.log 2>&1

Backup Rotation Script

Save as rotate-backups.sh:

#!/bin/bash
# Keep last 7 daily backups, 4 weekly backups, 12 monthly backups

BACKUP_DIR="/root/chatty-backups"

# Keep last 7 days
find "${BACKUP_DIR}" -name "chatty-backup-*" -mtime +7 -type d -exec rm -rf {} \;

echo "Backup rotation complete"

Backup Verification

Verify Backup Integrity

#!/bin/bash
# verify-backup.sh

BACKUP_PATH="/root/chatty-backups/chatty-backup-20260409_140000"

echo "Verifying backup: ${BACKUP_PATH}"

# Check PostgreSQL backup
echo "Checking PostgreSQL backup..."
gunzip -t "${BACKUP_PATH}"/postgres-*.sql.gz && echo "✓ PostgreSQL backup OK" || echo "✗ PostgreSQL backup FAILED"

# Check Qdrant backup
echo "Checking Qdrant backup..."
tar tzf "${BACKUP_PATH}"/qdrant-*.tar.gz > /dev/null && echo "✓ Qdrant backup OK" || echo "✗ Qdrant backup FAILED"

# Check uploads backup
echo "Checking uploads backup..."
tar tzf "${BACKUP_PATH}"/uploads-*.tar.gz > /dev/null && echo "✓ Uploads backup OK" || echo "✗ Uploads backup FAILED"

# Check config files
echo "Checking configuration files..."
[ -f "${BACKUP_PATH}/config/.env" ] && echo "✓ .env file OK" || echo "✗ .env file missing"
[ -f "${BACKUP_PATH}/config/docker-compose.yaml" ] && echo "✓ docker-compose.yaml OK" || echo "✗ docker-compose.yaml missing"

echo "Verification complete"

Off-Site Backup

Copy to Remote Server

# Using rsync
rsync -avz --progress /root/chatty-backups/ user@backup-server:/backups/chatty-ai/

# Using scp
scp -r /root/chatty-backups/chatty-backup-20260409_140000 user@backup-server:/backups/

Upload to Cloud Storage

# AWS S3
aws s3 sync /root/chatty-backups/ s3://my-bucket/chatty-backups/

# Google Cloud Storage
gsutil -m rsync -r /root/chatty-backups/ gs://my-bucket/chatty-backups/

# Azure Blob Storage
az storage blob upload-batch -d chatty-backups -s /root/chatty-backups/

Backup Best Practices

1. Regular Schedule

  • Daily backups: Automated via cron
  • Weekly backups: Full backup every Sunday
  • Monthly backups: Archive first Sunday of month
  • Before updates: Always backup before upgrading

2. Retention Policy

  • Keep last 7 daily backups
  • Keep last 4 weekly backups
  • Keep last 12 monthly backups
  • Archive critical backups indefinitely

3. Storage Locations

  • Primary: Local server storage
  • Secondary: Network-attached storage (NAS)
  • Tertiary: Cloud storage (S3, GCS, Azure)
  • Archive: Offline/cold storage for compliance

4. Security

# Encrypt backups
tar czf - /root/chatty-backups/chatty-backup-20260409_140000 | \
gpg --symmetric --cipher-algo AES256 > backup-encrypted.tar.gz.gpg

# Decrypt
gpg --decrypt backup-encrypted.tar.gz.gpg | tar xzf -

5. Testing

  • Test restore monthly
  • Document restore time
  • Verify data integrity
  • Update procedures as needed

Backup Checklist

  • Backup script downloaded and configured
  • Backup directory created with adequate space
  • Test backup completed successfully
  • Backup verified (all files present)
  • Automated backup scheduled (cron)
  • Off-site backup configured
  • Backup rotation policy implemented
  • Restore procedure tested
  • Backup monitoring configured
  • Documentation updated

Troubleshooting

Backup Fails - Disk Space

# Check available space
df -h

# Clean up old backups
find /root/chatty-backups -name "chatty-backup-*" -mtime +30 -exec rm -rf {} \;

# Clean up Docker
docker system prune -a

Database Backup Fails

# Check database is running
docker compose ps db

# Check database connectivity
docker compose exec db psql -U chattyAdmin -d chattydb -c "SELECT version();"

# Manual backup
docker compose exec db pg_dump -U chattyAdmin chattydb > backup.sql

Permission Denied

# Run as root or with sudo
sudo ./backup-chatty.sh

# Fix backup directory permissions
sudo chown -R $USER:$USER /root/chatty-backups