#!/bin/bash # ============================================================================ # Script de inicialização do PostgreSQL dentro do container Docker # para.AI API v3.0 - Hugging Face Spaces # ============================================================================ set -e echo "==================================================" echo "🐘 Inicializando PostgreSQL local..." echo "==================================================" # Variáveis POSTGRES_USER="${POSTGRES_USER:-para_ai}" POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-para_ai_temp}" POSTGRES_DB="${POSTGRES_DB:-para_ai}" PGDATA="/var/lib/postgresql/data" # Verificar se já foi inicializado if [ -d "$PGDATA/base" ]; then echo "✅ PostgreSQL já inicializado (dados existem)" else echo "📦 Inicializando cluster PostgreSQL..." # Criar diretório de dados mkdir -p "$PGDATA" chown -R postgres:postgres "$PGDATA" chmod 700 "$PGDATA" # Inicializar cluster como usuário postgres su - postgres -c "/usr/lib/postgresql/15/bin/initdb -D $PGDATA --encoding=UTF8 --locale=C" echo "✅ Cluster criado" fi # Configurar pg_hba.conf para aceitar conexões locais cat > "$PGDATA/pg_hba.conf" << EOF # TYPE DATABASE USER ADDRESS METHOD local all all trust host all all 127.0.0.1/32 md5 host all all ::1/128 md5 host all all 0.0.0.0/0 md5 EOF # Configurar postgresql.conf cat >> "$PGDATA/postgresql.conf" << EOF # Configurações para ambiente Docker/HF Spaces listen_addresses = '*' port = 5432 max_connections = 50 shared_buffers = 128MB work_mem = 4MB maintenance_work_mem = 64MB effective_cache_size = 256MB log_destination = 'stderr' logging_collector = off log_min_messages = warning log_min_error_statement = error EOF echo "✅ Configurações aplicadas" # Iniciar PostgreSQL em background echo "🚀 Iniciando servidor PostgreSQL..." su - postgres -c "/usr/lib/postgresql/15/bin/pg_ctl -D $PGDATA -l /var/log/postgresql/postgresql.log start" # Aguardar PostgreSQL ficar pronto echo "⏳ Aguardando PostgreSQL ficar pronto..." for i in {1..30}; do if su - postgres -c "psql -l" &> /dev/null; then echo "✅ PostgreSQL está pronto!" break fi echo " Tentativa $i/30..." sleep 1 done # Verificar se ficou pronto if ! su - postgres -c "psql -l" &> /dev/null; then echo "❌ PostgreSQL não iniciou corretamente!" cat /var/log/postgresql/postgresql.log exit 1 fi # Criar usuário se não existir echo "👤 Criando usuário $POSTGRES_USER..." su - postgres -c "psql -tc \"SELECT 1 FROM pg_user WHERE usename = '$POSTGRES_USER'\" | grep -q 1" || su - postgres -c "psql -c \"CREATE USER $POSTGRES_USER WITH PASSWORD '$POSTGRES_PASSWORD';\"" && echo "✅ Usuário criado" # Criar database se não existir echo "🗄️ Criando database $POSTGRES_DB..." su - postgres -c "psql -lqt | cut -d \| -f 1 | grep -qw $POSTGRES_DB" || su - postgres -c "psql -c \"CREATE DATABASE $POSTGRES_DB OWNER $POSTGRES_USER;\"" && echo "✅ Database criado" # Dar permissões su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE $POSTGRES_DB TO $POSTGRES_USER;\"" # Executar DDL se arquivo existir if [ -f "/app/database/init_db.sql" ]; then echo "📜 Executando DDL..." PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -f /app/database/init_db.sql echo "✅ DDL executado" else echo "⚠️ Arquivo init_db.sql não encontrado" fi # Executar seed data se arquivo existir if [ -f "/app/scripts/seed_data.sql" ]; then echo "🌱 Inserindo dados de teste..." PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -f /app/scripts/seed_data.sql echo "✅ Seed data inserido" fi # Mostrar status echo "" echo "==================================================" echo "✅ PostgreSQL inicializado com sucesso!" echo "==================================================" echo "📊 Informações:" echo " Host: localhost" echo " Port: 5432" echo " Database: $POSTGRES_DB" echo " User: $POSTGRES_USER" echo "" # Mostrar estatísticas echo "📈 Estatísticas:" PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -c " SELECT 'Tribunais' as tabela, COUNT(*)::text as registros FROM tribunais UNION ALL SELECT 'Usuários', COUNT(*)::text FROM usuarios UNION ALL SELECT 'Acórdãos', COUNT(*)::text FROM acordaos UNION ALL SELECT 'Decisões', COUNT(*)::text FROM decisoes; " 2>/dev/null || echo " (tabelas ainda não criadas)" echo "" echo "✅ Pronto para iniciar API!" echo "=================================================="