mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 19:01:08 +02:00
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
99 lines
2.4 KiB
Bash
Executable file
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"
|