From 4b2e2a764bd648e08ca871c9ac8f38424988471b Mon Sep 17 00:00:00 2001 From: Jose Henrique Date: Thu, 19 Jun 2025 20:44:11 -0300 Subject: [PATCH] db scripts --- backup-db.sh | 56 ++++++++++++++++++++++++++++++++++++ deploy-db.sh | 80 ++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 115 insertions(+), 21 deletions(-) create mode 100644 backup-db.sh diff --git a/backup-db.sh b/backup-db.sh new file mode 100644 index 0000000..6c8080a --- /dev/null +++ b/backup-db.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# OpenCand Database Backup Script +# This script creates a backup of the PostgreSQL database (excluding materialized views) + +set -e # Exit on any error + +# Configuration +DB_CONTAINER="opencand_db" +DB_NAME="opencand" +DB_USER="root" +BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).sql" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${YELLOW}๐Ÿ’พ OpenCand Database Backup Script${NC}" +echo "==================================" + +# Check if Docker is running +if ! docker info >/dev/null 2>&1; then + echo -e "${RED}โŒ Error: Docker is not running or not accessible${NC}" + exit 1 +fi + +# Check if the database container is running +if ! docker ps --format "table {{.Names}}" | grep -q "^${DB_CONTAINER}$"; then + echo -e "${RED}โŒ Error: Database container '${DB_CONTAINER}' is not running${NC}" + echo "Please start the services with: docker-compose up -d" + exit 1 +fi + +echo -e "${YELLOW}๐Ÿ“‹ Creating backup (excluding materialized views)...${NC}" + +# Get list of materialized views +MATVIEWS=$(docker exec $DB_CONTAINER psql -U $DB_USER -d $DB_NAME -Atc "SELECT schemaname || '.' || matviewname FROM pg_matviews;") + +# Build exclude flags for pg_dump +EXCLUDE_FLAGS="" +for mv in $MATVIEWS; do + EXCLUDE_FLAGS+=" --exclude-table=$mv" +done + +# Run pg_dump excluding materialized views +if docker exec $DB_CONTAINER pg_dump -U $DB_USER -d $DB_NAME $EXCLUDE_FLAGS > "$BACKUP_FILE"; then + echo -e "${GREEN}โœ… Backup created: $BACKUP_FILE${NC}" +else + echo -e "${RED}โŒ Error: Failed to create backup${NC}" + exit 1 +fi + +echo -e "${GREEN}๐ŸŽ‰ Backup completed successfully!${NC}" +echo "==================================" diff --git a/deploy-db.sh b/deploy-db.sh index c31be92..9f2bd15 100755 --- a/deploy-db.sh +++ b/deploy-db.sh @@ -11,6 +11,8 @@ DB_NAME="opencand" DB_USER="root" SQL_URL="https://git.ivanch.me/ivanch/opencand/raw/branch/main/db/db.sql" SQL_FILE="./db.sql" +MV_URL="https://git.ivanch.me/ivanch/opencand/raw/branch/main/db/mv.sql" +MV_FILE="./mv.sql" # Colors for output RED='\033[0;31m' @@ -34,20 +36,32 @@ if ! docker ps --format "table {{.Names}}" | grep -q "^${DB_CONTAINER}$"; then exit 1 fi -# Download the SQL file -echo -e "${YELLOW}๐Ÿ“ฅ Downloading SQL file...${NC}" +# Download the SQL files +echo -e "${YELLOW}๐Ÿ“ฅ Downloading SQL files...${NC}" if command -v curl &> /dev/null; then if curl -L -o "$SQL_FILE" "$SQL_URL"; then - echo "โœ… SQL file downloaded successfully" + echo "โœ… db.sql downloaded successfully" else - echo -e "${RED}โŒ Error: Failed to download SQL file from ${SQL_URL}${NC}" + echo -e "${RED}โŒ Error: Failed to download db.sql from ${SQL_URL}${NC}" + exit 1 + fi + if curl -L -o "$MV_FILE" "$MV_URL"; then + echo "โœ… mv.sql downloaded successfully" + else + echo -e "${RED}โŒ Error: Failed to download mv.sql from ${MV_URL}${NC}" exit 1 fi elif command -v wget &> /dev/null; then if wget -O "$SQL_FILE" "$SQL_URL"; then - echo "โœ… SQL file downloaded successfully" + echo "โœ… db.sql downloaded successfully" else - echo -e "${RED}โŒ Error: Failed to download SQL file from ${SQL_URL}${NC}" + echo -e "${RED}โŒ Error: Failed to download db.sql from ${SQL_URL}${NC}" + exit 1 + fi + if wget -O "$MV_FILE" "$MV_URL"; then + echo "โœ… mv.sql downloaded successfully" + else + echo -e "${RED}โŒ Error: Failed to download mv.sql from ${MV_URL}${NC}" exit 1 fi else @@ -55,16 +69,21 @@ else exit 1 fi -# Check if SQL file exists (after download) +# Check if SQL files exist (after download) if [ ! -f "$SQL_FILE" ]; then echo -e "${RED}โŒ Error: SQL file '${SQL_FILE}' not found after download${NC}" exit 1 fi +if [ ! -f "$MV_FILE" ]; then + echo -e "${RED}โŒ Error: SQL file '${MV_FILE}' not found after download${NC}" + exit 1 +fi echo -e "${YELLOW}๐Ÿ“‹ Pre-deployment checks:${NC}" echo "โœ… Docker is running" echo "โœ… Database container is running" -echo "โœ… SQL file downloaded" +echo "โœ… db.sql downloaded" +echo "โœ… mv.sql downloaded" echo "" # Wait for database to be ready @@ -82,29 +101,48 @@ done echo "โœ… Database is ready" echo "" -# Deploy the SQL file -echo -e "${YELLOW}๐Ÿ”ง Deploying database changes...${NC}" + +# Deploy the db.sql file +echo -e "${YELLOW}๐Ÿ”ง Deploying database changes (db.sql)...${NC}" echo "Executing: $SQL_FILE" if docker exec -i $DB_CONTAINER psql -U $DB_USER -d $DB_NAME < $SQL_FILE; then - echo -e "${GREEN}โœ… Database deployment completed successfully!${NC}" - echo "" - - # Show table information - echo -e "${YELLOW}๐Ÿ“Š Current database tables:${NC}" - docker exec $DB_CONTAINER psql -U $DB_USER -d $DB_NAME -c "\dt" - + echo -e "${GREEN}โœ… db.sql deployment completed successfully!${NC}" else - echo -e "${RED}โŒ Error: Database deployment failed${NC}" + echo -e "${RED}โŒ Error: db.sql deployment failed${NC}" echo -e "${YELLOW}๐Ÿ’ก You can restore from backup using:${NC}" echo "docker exec -i $DB_CONTAINER psql -U $DB_USER -d $DB_NAME < $BACKUP_FILE" + # Clean up before exit + rm -f "$SQL_FILE" "$MV_FILE" exit 1 fi -# Clean up downloaded SQL file +# Deploy the mv.sql file +echo -e "${YELLOW}๏ฟฝ Deploying database changes (mv.sql)...${NC}" +echo "Executing: $MV_FILE" + +if docker exec -i $DB_CONTAINER psql -U $DB_USER -d $DB_NAME < $MV_FILE; then + echo -e "${GREEN}โœ… mv.sql deployment completed successfully!${NC}" +else + echo -e "${RED}โŒ Error: mv.sql deployment failed${NC}" + echo -e "${YELLOW}๐Ÿ’ก You can restore from backup using:${NC}" + echo "docker exec -i $DB_CONTAINER psql -U $DB_USER -d $DB_NAME < $BACKUP_FILE" + # Clean up before exit + rm -f "$SQL_FILE" "$MV_FILE" + exit 1 +fi + + +# Show table and materialized view information +echo -e "${YELLOW}๐Ÿ“Š Current database tables:${NC}" +docker exec $DB_CONTAINER psql -U $DB_USER -d $DB_NAME -c "\dt" +echo -e "${YELLOW}๐Ÿ“„ Current materialized views:${NC}" +docker exec $DB_CONTAINER psql -U $DB_USER -d $DB_NAME -c "\dm" + +# Clean up downloaded SQL files echo -e "${YELLOW}๐Ÿงน Cleaning up...${NC}" -rm -f "$SQL_FILE" -echo "โœ… Temporary SQL file removed" +rm -f "$SQL_FILE" "$MV_FILE" +echo "โœ… Temporary SQL files removed" echo "" echo -e "${GREEN}๐ŸŽ‰ Deployment completed successfully!${NC}"