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
Related Documentation
- Restore Procedure - How to restore from backup
- Database Variables - Database configuration
- Service Management - Managing services