Skip to content

Backup & Restore

Glean data is stored in the following locations:

Data TypeStorage LocationImportance
DatabasePostgreSQL (postgres_data volume)Critical
CacheRedis (redis_data volume)Optional
Logsglean_logs volumeOptional
Vector DataMilvus volumes (full version)Important
Terminal window
# Backup PostgreSQL database
docker exec glean-postgres pg_dump -U glean glean | gzip > glean_db_$(date +%Y%m%d_%H%M%S).sql.gz

Create backup script backup-glean.sh:

#!/bin/bash
BACKUP_DIR="$HOME/glean-backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Backup PostgreSQL
docker exec glean-postgres pg_dump -U glean glean | gzip > "$BACKUP_DIR/glean_db_$DATE.sql.gz"
# Backup PostgreSQL data volume
docker run --rm \
-v glean_postgres_data:/data \
-v "$BACKUP_DIR":/backup \
alpine tar czf /backup/postgres_data_$DATE.tar.gz -C /data .
# Backup Redis data volume
docker run --rm \
-v glean_redis_data:/data \
-v "$BACKUP_DIR":/backup \
alpine tar czf /backup/redis_data_$DATE.tar.gz -C /data .
# Clean up backups older than 7 days
find "$BACKUP_DIR" -name "*.gz" -mtime +7 -delete
echo "Backup completed: $BACKUP_DIR"

Set execute permission and run:

Terminal window
chmod +x backup-glean.sh
./backup-glean.sh

Set up daily backups with cron:

Terminal window
# Edit crontab
crontab -e
# Add daily backup at 2 AM
0 2 * * * /path/to/backup-glean.sh
Terminal window
# Stop services
docker compose down
# Start database
docker compose up -d postgres
# Wait for database to be ready
sleep 10
# Restore data
gunzip -c glean_db_20250101_020000.sql.gz | docker exec -i glean-postgres psql -U glean -d glean
# Start all services
docker compose up -d
Terminal window
# Stop services
docker compose down
# Remove old volume
docker volume rm glean_postgres_data
# Create new volume
docker volume create glean_postgres_data
# Restore data
docker run --rm \
-v glean_postgres_data:/data \
-v "$HOME/glean-backups":/backup \
alpine tar xzf /backup/postgres_data_20250101_020000.tar.gz -C /data
# Start services
docker compose up -d

Full version also needs to backup Milvus data:

#!/bin/bash
BACKUP_DIR="$HOME/glean-backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Backup PostgreSQL
docker exec glean-postgres pg_dump -U glean glean | gzip > "$BACKUP_DIR/glean_db_$DATE.sql.gz"
# Backup all data volumes
for volume in postgres_data redis_data milvus_etcd_data milvus_minio_data milvus_data; do
docker run --rm \
-v glean_${volume}:/data \
-v "$BACKUP_DIR":/backup \
alpine tar czf /backup/${volume}_$DATE.tar.gz -C /data .
done
echo "Full backup completed: $BACKUP_DIR"

On the old server:

Terminal window
# Backup database
docker exec glean-postgres pg_dump -U glean glean | gzip > glean_backup.sql.gz
# Export OPML (optional, user-level)
# Export via Web interface

On the new server:

Terminal window
# Deploy Glean
curl -fsSL https://raw.githubusercontent.com/LeslieLeung/glean/main/docker-compose.yml -o docker-compose.yml
docker compose up -d
# Wait for database to be ready
sleep 30
# Restore data
gunzip -c glean_backup.sql.gz | docker exec -i glean-postgres psql -U glean -d glean
# Restart services
docker compose restart
StrategyFrequencyRetentionDescription
Daily BackupDaily7 daysSQL backup
Weekly BackupWeekly4 weeksFull volume backup
Monthly BackupMonthly12 monthsArchive backup

Regularly verify backup integrity:

Terminal window
# Check backup files
gunzip -t glean_db_*.sql.gz
# Restore in test environment to verify
docker compose -f docker-compose.test.yml up -d
# Restore and verify data