managarten/docker/production/backup.sh
Claude 22a58eecef
feat(deploy): add production deployment configuration for manacore.ai
Complete production setup with:
- docker-compose.yml with all recommended apps (auth, chat, todo, calendar, clock, dashboard)
- Caddyfile for automatic HTTPS via Let's Encrypt
- PostgreSQL backup/restore scripts with daily retention
- Environment template with secure defaults
- Comprehensive deployment guide

Apps deployed:
- auth.manacore.ai (Authentication)
- app.manacore.ai (Dashboard)
- chat.manacore.ai / chat-api.manacore.ai
- todo.manacore.ai / todo-api.manacore.ai
- calendar.manacore.ai / calendar-api.manacore.ai
- clock.manacore.ai / clock-api.manacore.ai
2026-01-16 20:42:59 +00:00

99 lines
2.4 KiB
Bash
Executable file

#!/bin/bash
# ManaCore PostgreSQL Backup Script
#
# Usage:
# ./backup.sh # Backup all databases
# ./backup.sh chat # Backup specific database
#
# Setup cron for daily backups:
# crontab -e
# 0 3 * * * /opt/manacore/backup.sh >> /var/log/manacore-backup.log 2>&1
set -euo pipefail
# Configuration
BACKUP_DIR="${BACKUP_DIR:-./backups}"
CONTAINER_NAME="${CONTAINER_NAME:-manacore-postgres}"
POSTGRES_USER="${POSTGRES_USER:-postgres}"
RETENTION_DAYS="${RETENTION_DAYS:-7}"
# Databases to backup (add more as needed)
DATABASES=("manacore_auth" "chat" "todo" "calendar" "clock")
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() {
echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}
# Create backup directory if not exists
mkdir -p "$BACKUP_DIR"
# Timestamp for backup files
TIMESTAMP=$(date '+%Y%m%d_%H%M%S')
backup_database() {
local db_name=$1
local backup_file="${BACKUP_DIR}/${db_name}_${TIMESTAMP}.sql.gz"
log_info "Backing up database: $db_name"
if docker exec "$CONTAINER_NAME" pg_dump -U "$POSTGRES_USER" "$db_name" 2>/dev/null | gzip > "$backup_file"; then
local size=$(du -h "$backup_file" | cut -f1)
log_info "Created: $backup_file ($size)"
return 0
else
log_error "Failed to backup $db_name"
rm -f "$backup_file"
return 1
fi
}
cleanup_old_backups() {
log_info "Cleaning up backups older than $RETENTION_DAYS days..."
find "$BACKUP_DIR" -name "*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete
local count=$(find "$BACKUP_DIR" -name "*.sql.gz" -type f | wc -l)
log_info "Remaining backups: $count"
}
# Main execution
log_info "=== ManaCore Backup Started ==="
# Check if specific database requested
if [ $# -eq 1 ]; then
backup_database "$1"
else
# Backup all databases
failed=0
for db in "${DATABASES[@]}"; do
if ! backup_database "$db"; then
((failed++))
fi
done
if [ $failed -gt 0 ]; then
log_warn "$failed database(s) failed to backup"
fi
fi
# Cleanup old backups
cleanup_old_backups
log_info "=== ManaCore Backup Completed ==="
# Summary
echo ""
log_info "Backup summary:"
ls -lh "$BACKUP_DIR"/*.sql.gz 2>/dev/null | tail -10 || log_warn "No backups found"