opencand.infra/deploy-db.sh
2025-06-19 20:44:11 -03:00

150 lines
4.7 KiB
Bash
Executable File
Raw Blame History

#!/bin/bash
# OpenCand Database Deployment Script
# This script deploys the database schema changes to the PostgreSQL container
set -e # Exit on any error
# Configuration
DB_CONTAINER="opencand_db"
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'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${YELLOW}🚀 OpenCand Database Deployment 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
# 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 "✅ db.sql downloaded successfully"
else
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 "✅ db.sql downloaded successfully"
else
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
echo -e "${RED}❌ Error: Neither curl nor wget is available for downloading${NC}"
exit 1
fi
# 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 "✅ db.sql downloaded"
echo "✅ mv.sql downloaded"
echo ""
# Wait for database to be ready
echo -e "${YELLOW}⏳ Waiting for database to be ready...${NC}"
timeout=30
counter=0
while ! docker exec $DB_CONTAINER pg_isready -U $DB_USER -d $DB_NAME >/dev/null 2>&1; do
sleep 1
counter=$((counter + 1))
if [ $counter -ge $timeout ]; then
echo -e "${RED}❌ Error: Database failed to become ready within ${timeout} seconds${NC}"
exit 1
fi
done
echo "✅ Database is ready"
echo ""
# 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}✅ db.sql deployment completed successfully!${NC}"
else
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
# Deploy the mv.sql file
echo -e "${YELLOW}<EFBFBD> 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" "$MV_FILE"
echo "✅ Temporary SQL files removed"
echo ""
echo -e "${GREEN}🎉 Deployment completed successfully!${NC}"
echo "=================================="