Carlex22 commited on
Commit
b3b94f2
·
1 Parent(s): 0211e6e

ParaAIV3.0

Browse files
Files changed (4) hide show
  1. Dockerfile +73 -24
  2. README.md +195 -1
  3. docker-entrypoint.sh +127 -0
  4. init-postgres.sh +140 -0
Dockerfile CHANGED
@@ -1,5 +1,6 @@
1
  # ============================================================================
2
  # Dockerfile para Hugging Face Spaces - para.AI API v3.0
 
3
  # ============================================================================
4
 
5
  FROM python:3.11-slim
@@ -7,54 +8,102 @@ FROM python:3.11-slim
7
  # Metadados
8
  LABEL maintainer="para.AI Team"
9
  LABEL version="3.0.0"
10
- LABEL description="API de análise jurisprudencial com IA"
11
 
12
- # Definir diretório de trabalho
13
- WORKDIR /app
14
-
15
- # Variáveis de ambiente padrão (sobrescritas pelas Secrets do HF Spaces)
16
  ENV PYTHONUNBUFFERED=1 \
17
  PYTHONDONTWRITEBYTECODE=1 \
18
  PIP_NO_CACHE_DIR=1 \
19
  PIP_DISABLE_PIP_VERSION_CHECK=1 \
20
- APP_ENV=production \
21
- HOST=0.0.0.0 \
22
- PORT=7860
23
 
24
- # Instalar dependências do sistema
 
 
 
 
 
25
  RUN apt-get update && apt-get install -y \
 
26
  gcc \
27
  g++ \
28
- postgresql-client \
29
- libpq-dev \
 
 
 
 
30
  curl \
 
 
31
  && rm -rf /var/lib/apt/lists/*
32
 
33
- # Copiar requirements primeiro (para cache do Docker)
34
- COPY requirements.txt .
 
 
 
35
 
36
- # Instalar dependências Python
 
 
 
 
 
 
 
 
 
 
 
37
  RUN pip install --no-cache-dir -r requirements.txt
38
 
39
- # Copiar código da aplicação
 
 
40
  COPY . .
41
 
42
- # Criar diretórios necessários
 
 
 
 
 
 
 
 
 
43
  RUN mkdir -p /app/data/uploads \
44
  /app/data/outputs \
45
  /app/data/temp \
46
  /app/data/backups \
47
- /app/logs
 
48
 
49
- # Permissões
50
- RUN chmod -R 755 /app
 
 
 
 
 
 
 
 
51
 
52
- # Health check
53
- HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
 
 
54
  CMD curl -f http://localhost:7860/api/v1/health || exit 1
55
 
56
- # Expor porta (HF Spaces usa 7860)
57
  EXPOSE 7860
 
58
 
59
- # Comando de inicialização
60
- CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "7860", "--workers", "2"]
 
 
 
 
1
  # ============================================================================
2
  # Dockerfile para Hugging Face Spaces - para.AI API v3.0
3
+ # Com PostgreSQL temporário embutido (ideal para testes/demo)
4
  # ============================================================================
5
 
6
  FROM python:3.11-slim
 
8
  # Metadados
9
  LABEL maintainer="para.AI Team"
10
  LABEL version="3.0.0"
11
+ LABEL description="API de análise jurisprudencial com IA + PostgreSQL local"
12
 
13
+ # Variáveis de ambiente
 
 
 
14
  ENV PYTHONUNBUFFERED=1 \
15
  PYTHONDONTWRITEBYTECODE=1 \
16
  PIP_NO_CACHE_DIR=1 \
17
  PIP_DISABLE_PIP_VERSION_CHECK=1 \
18
+ DEBIAN_FRONTEND=noninteractive \
19
+ POSTGRES_VERSION=15
 
20
 
21
+ # Definir diretório de trabalho
22
+ WORKDIR /app
23
+
24
+ # ============================================================================
25
+ # INSTALAR DEPENDÊNCIAS DO SISTEMA + POSTGRESQL
26
+ # ============================================================================
27
  RUN apt-get update && apt-get install -y \
28
+ # Build essentials
29
  gcc \
30
  g++ \
31
+ make \
32
+ # PostgreSQL
33
+ postgresql-${POSTGRES_VERSION} \
34
+ postgresql-client-${POSTGRES_VERSION} \
35
+ postgresql-contrib-${POSTGRES_VERSION} \
36
+ # Utilities
37
  curl \
38
+ wget \
39
+ procps \
40
  && rm -rf /var/lib/apt/lists/*
41
 
42
+ # ============================================================================
43
+ # CONFIGURAR POSTGRESQL
44
+ # ============================================================================
45
+ # Criar usuário postgres se não existir
46
+ RUN useradd -m -s /bin/bash postgres || true
47
 
48
+ # Criar diretórios para PostgreSQL
49
+ RUN mkdir -p /var/lib/postgresql/data \
50
+ /var/run/postgresql \
51
+ /var/log/postgresql \
52
+ && chown -R postgres:postgres /var/lib/postgresql \
53
+ && chown -R postgres:postgres /var/run/postgresql \
54
+ && chmod 2777 /var/run/postgresql
55
+
56
+ # ============================================================================
57
+ # INSTALAR DEPENDÊNCIAS PYTHON
58
+ # ============================================================================
59
+ COPY requirements.txt .
60
  RUN pip install --no-cache-dir -r requirements.txt
61
 
62
+ # ============================================================================
63
+ # COPIAR CÓDIGO DA APLICAÇÃO
64
+ # ============================================================================
65
  COPY . .
66
 
67
+ # ============================================================================
68
+ # COPIAR SCRIPTS DE INICIALIZAÇÃO
69
+ # ============================================================================
70
+ COPY scripts/docker-entrypoint.sh /docker-entrypoint.sh
71
+ COPY scripts/init-postgres.sh /init-postgres.sh
72
+ RUN chmod +x /docker-entrypoint.sh /init-postgres.sh
73
+
74
+ # ============================================================================
75
+ # CRIAR DIRETÓRIOS DA APLICAÇÃO
76
+ # ============================================================================
77
  RUN mkdir -p /app/data/uploads \
78
  /app/data/outputs \
79
  /app/data/temp \
80
  /app/data/backups \
81
+ /app/logs \
82
+ && chmod -R 755 /app
83
 
84
+ # ============================================================================
85
+ # CONFIGURAÇÕES PADRÃO (podem ser sobrescritas por Secrets do HF)
86
+ # ============================================================================
87
+ ENV APP_ENV=production \
88
+ HOST=0.0.0.0 \
89
+ PORT=7860 \
90
+ DATABASE_URL=postgresql://para_ai:para_ai_temp@localhost:5432/para_ai \
91
+ POSTGRES_USER=para_ai \
92
+ POSTGRES_PASSWORD=para_ai_temp \
93
+ POSTGRES_DB=para_ai
94
 
95
+ # ============================================================================
96
+ # HEALTH CHECK
97
+ # ============================================================================
98
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
99
  CMD curl -f http://localhost:7860/api/v1/health || exit 1
100
 
101
+ # Expor portas
102
  EXPOSE 7860
103
+ EXPOSE 5432
104
 
105
+ # ============================================================================
106
+ # ENTRYPOINT
107
+ # ============================================================================
108
+ ENTRYPOINT ["/docker-entrypoint.sh"]
109
+ CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "7860", "--workers", "1"]
README.md CHANGED
@@ -9,4 +9,198 @@ license: agpl-3.0
9
  ---
10
 
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  ---
10
 
11
 
12
+ # ⚖️ para.AI - Análise Jurisprudencial com IA
13
+
14
+ Sistema completo de análise automatizada de acórdãos jurídicos usando **9 especialistas IA** (LLMs).
15
+
16
+ ## 🚀 Funcionalidades
17
+
18
+ - 📤 **Upload de lotes** (arquivos JSONL)
19
+ - 🤖 **9 processadores especializados** para análise completa
20
+ - 📦 **Download de resultados** em TAR.GZ
21
+ - 🐘 **PostgreSQL embutido** (temporário para testes)
22
+ - 🔍 **API completa para debug**
23
+
24
+ ## 📚 Documentação
25
+
26
+ Acesse a **documentação interativa** em: [/api/docs](/api/docs)
27
+
28
+ ## ⚡ Quick Start
29
+
30
+ ### 1. Testar API
31
+
32
+ ```bash
33
+ curl https://seu-space.hf.space/api/v1/health
34
+ ```
35
+
36
+ ### 2. Upload de acórdãos
37
+
38
+ ```bash
39
+ # Criar arquivo JSONL de teste
40
+ cat > acordaos.jsonl << 'EOF'
41
+ {"acordao_id":"001","tribunal":"TJPR","ementa":"Teste ementa","integra":"Conteúdo completo do acórdão"}
42
+ EOF
43
+
44
+ # Fazer upload
45
+ curl -X POST "https://seu-space.hf.space/api/v1/process/upload" \
46
+ -F "file=@acordaos.jsonl" \
47
+ -F "llm_provider=groq" \
48
+ -F "enable_parallel=true"
49
+ ```
50
+
51
+ ### 3. Consultar status
52
+
53
+ ```bash
54
+ curl https://seu-space.hf.space/api/v1/process/status/TASK_ID
55
+ ```
56
+
57
+ ### 4. Download de resultados
58
+
59
+ ```bash
60
+ curl -O https://seu-space.hf.space/api/v1/process/download/TASK_ID
61
+ ```
62
+
63
+ ## 🗄️ Banco de Dados
64
+
65
+ ### Modo 1: PostgreSQL Temporário (Padrão)
66
+
67
+ Por padrão, um **PostgreSQL local** é iniciado dentro do container:
68
+ - ✅ Pronto para uso imediatamente
69
+ - ✅ Sem configuração necessária
70
+ - ⚠️ **Dados são perdidos ao reiniciar**
71
+
72
+ ### Modo 2: Banco Externo (Recomendado para produção)
73
+
74
+ Configure um banco PostgreSQL externo usando **Repository Secrets**:
75
+
76
+ #### Opção A: Neon (Recomendado - Grátis)
77
+
78
+ 1. Acesse [neon.tech](https://neon.tech)
79
+ 2. Crie projeto gratuito
80
+ 3. Copie connection string
81
+ 4. Em **Settings → Repository Secrets**, adicione:
82
+ ```
83
+ DATABASE_URL=postgresql://usuario:senha@ep-xxx.neon.tech/para_ai?sslmode=require
84
+ ```
85
+
86
+ #### Opção B: Supabase (Grátis)
87
+
88
+ 1. Acesse [supabase.com](https://supabase.com)
89
+ 2. Crie projeto
90
+ 3. Em Database → Connection string, copie
91
+ 4. Adicione nas Secrets:
92
+ ```
93
+ DATABASE_URL=postgresql://postgres:[senha]@db.xxx.supabase.co:5432/postgres
94
+ ```
95
+
96
+ ## 🔑 Configuração de LLM
97
+
98
+ Configure pelo menos uma **API key de LLM** nas Repository Secrets:
99
+
100
+ ### Groq (Recomendado - Rápido e barato)
101
+ ```
102
+ GROQ_API_KEY=gsk_sua_key_aqui
103
+ ```
104
+ Obtenha em: [console.groq.com](https://console.groq.com/)
105
+
106
+ ### OpenAI (Opcional)
107
+ ```
108
+ OPENAI_API_KEY=sk-sua_key_aqui
109
+ ```
110
+
111
+ ### Anthropic (Opcional)
112
+ ```
113
+ ANTHROPIC_API_KEY=sk-ant-sua_key_aqui
114
+ ```
115
+
116
+ ## ⚙️ Repository Secrets
117
+
118
+ Configure em **Settings → Repository Secrets**:
119
+
120
+ ### Obrigatórios
121
+ - `GROQ_API_KEY` - API key do Groq (ou OpenAI/Anthropic)
122
+
123
+ ### Opcionais (para produção)
124
+ - `DATABASE_URL` - PostgreSQL externo (recomendado)
125
+ - `APP_ENV=production`
126
+ - `LOG_LEVEL=INFO`
127
+ - `ENABLE_CACHE=true`
128
+ - `REDIS_URL` - Se usar cache Redis
129
+
130
+ ## 🧪 Endpoints Principais
131
+
132
+ | Método | Endpoint | Descrição |
133
+ |--------|----------|-----------|
134
+ | GET | `/api/v1/health` | Health check |
135
+ | POST | `/api/v1/process/upload` | Upload de JSONL |
136
+ | GET | `/api/v1/process/status/{id}` | Status da task |
137
+ | GET | `/api/v1/process/download/{id}` | Download resultados |
138
+ | GET | `/api/v1/debug/info` | Info do sistema |
139
+ | GET | `/api/docs` | Documentação Swagger |
140
+
141
+ ## 📋 Formato JSONL
142
+
143
+ Cada linha deve ser um JSON com a estrutura:
144
+
145
+ ```json
146
+ {
147
+ "acordao_id": "identificador-unico",
148
+ "tribunal": "TJPR",
149
+ "numero": "0000001-00.2025.8.16.0000",
150
+ "ementa": "Texto da ementa...",
151
+ "integra": "Texto completo do acórdão...",
152
+ "relator": "Des. Nome do Relator",
153
+ "data_julgamento": "2025-01-15"
154
+ }
155
+ ```
156
+
157
+ **Campos obrigatórios:** `ementa`, `integra`
158
+
159
+ ## 🤖 Especialistas IA
160
+
161
+ O sistema processa cada acórdão com **9 especialistas**:
162
+
163
+ 1. **Metadados** - Extração de informações estruturadas
164
+ 2. **Relatório** - Análise do relatório processual
165
+ 3. **Fundamentação** - Análise da fundamentação legal
166
+ 4. **Decisão** - Análise do dispositivo decisório
167
+ 5. **Auditoria** - Verificação de qualidade
168
+ 6. **Arquivo Relacional** - Estruturação para BD
169
+ 7. **Segmentação Sintática** - Análise linguística
170
+ 8. **Análise Contextual** - Contexto jurídico
171
+ 9. **Transcrição 3-Partite** - Estruturação tripartite
172
+
173
+ ## 📊 Métricas
174
+
175
+ Veja métricas de processamento em:
176
+ - `/api/v1/debug/info` - Info do sistema
177
+ - `/api/v1/debug/tasks` - Tasks ativas
178
+
179
+ ## ⚠️ Limitações (Modo PostgreSQL Temporário)
180
+
181
+ - **Dados não persistem** entre reinicializações
182
+ - **Limite de armazenamento** do container
183
+ - **Performance reduzida** vs banco dedicado
184
+
185
+ Para produção, **use banco externo** (Neon/Supabase).
186
+
187
+ ## 🔒 Segurança
188
+
189
+ Para produção, configure nas Secrets:
190
+ ```
191
+ APP_ENV=production
192
+ DEBUG=false
193
+ REQUIRE_API_KEY=true
194
+ VALID_API_KEYS=sua_key_super_secreta
195
+ ```
196
+
197
+ ## 📖 Mais Informações
198
+
199
+ - **Documentação completa:** [/api/docs](/api/docs)
200
+ - **Health Check:** [/api/v1/health](/api/v1/health)
201
+ - **Repositório:** [GitHub](seu-repo)
202
+
203
+ ---
204
+
205
+ **Desenvolvido com ❤️ para análise jurisprudencial automatizada**
206
+
docker-entrypoint.sh ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # ============================================================================
3
+ # Docker Entrypoint - para.AI API v3.0
4
+ # Inicializa PostgreSQL local + API FastAPI
5
+ # ============================================================================
6
+
7
+ set -e
8
+
9
+ echo ""
10
+ echo "╔══════════════════════════════════════════════════════════════╗"
11
+ echo "║ para.AI API v3.0 ║"
12
+ echo "║ Análise Jurisprudencial com IA ║"
13
+ echo "╚══════════════════════════════════════════════════════════════╝"
14
+ echo ""
15
+
16
+ # ============================================================================
17
+ # FASE 1: VERIFICAR AMBIENTE
18
+ # ============================================================================
19
+ echo "🔍 Verificando ambiente..."
20
+
21
+ # Mostrar informações do sistema
22
+ echo " Python: $(python --version)"
23
+ echo " PostgreSQL: $(su - postgres -c 'psql --version' | head -1)"
24
+ echo " Diretório: $(pwd)"
25
+ echo ""
26
+
27
+ # ============================================================================
28
+ # FASE 2: INICIALIZAR POSTGRESQL
29
+ # ============================================================================
30
+ echo "🐘 Inicializando PostgreSQL local..."
31
+ /init-postgres.sh
32
+
33
+ # Verificar se PostgreSQL está rodando
34
+ if ! pg_isready -h localhost -p 5432 &> /dev/null; then
35
+ echo "❌ PostgreSQL não está rodando!"
36
+ exit 1
37
+ fi
38
+
39
+ echo "✅ PostgreSQL OK"
40
+ echo ""
41
+
42
+ # ============================================================================
43
+ # FASE 3: CONFIGURAR VARIÁVEIS DE AMBIENTE
44
+ # ============================================================================
45
+ echo "⚙️ Configurando variáveis de ambiente..."
46
+
47
+ # Se DATABASE_URL não foi fornecida, usar a local
48
+ if [ -z "$DATABASE_URL" ] || [ "$DATABASE_URL" = "postgresql://para_ai:para_ai_temp@localhost:5432/para_ai" ]; then
49
+ export DATABASE_URL="postgresql://${POSTGRES_USER:-para_ai}:${POSTGRES_PASSWORD:-para_ai_temp}@localhost:5432/${POSTGRES_DB:-para_ai}"
50
+ echo " DATABASE_URL configurada para PostgreSQL local"
51
+ fi
52
+
53
+ # Configurações padrão para HF Spaces
54
+ export APP_ENV="${APP_ENV:-production}"
55
+ export DEBUG="${DEBUG:-false}"
56
+ export HOST="${HOST:-0.0.0.0}"
57
+ export PORT="${PORT:-7860}"
58
+
59
+ echo " APP_ENV: $APP_ENV"
60
+ echo " PORT: $PORT"
61
+ echo " DATABASE: PostgreSQL local"
62
+ echo ""
63
+
64
+ # ============================================================================
65
+ # FASE 4: TESTAR CONEXÃO COM BANCO
66
+ # ============================================================================
67
+ echo "🔗 Testando conexão com banco de dados..."
68
+
69
+ python3 << 'PYTHON_TEST'
70
+ import sys
71
+ from api.config import get_settings
72
+
73
+ try:
74
+ settings = get_settings()
75
+ print(f" ✅ Configurações carregadas")
76
+ print(f" ✅ Environment: {settings.APP_ENV}")
77
+ print(f" ✅ Database URL configurada")
78
+ except Exception as e:
79
+ print(f" ❌ Erro ao carregar configurações: {e}")
80
+ sys.exit(1)
81
+
82
+ # Testar conexão com DB
83
+ try:
84
+ from database.db_manager import get_db_manager
85
+ db = get_db_manager()
86
+ if db.health_check():
87
+ print(f" ✅ Conexão com PostgreSQL OK")
88
+ else:
89
+ print(f" ❌ Falha no health check do DB")
90
+ sys.exit(1)
91
+ except Exception as e:
92
+ print(f" ❌ Erro ao conectar com DB: {e}")
93
+ sys.exit(1)
94
+ PYTHON_TEST
95
+
96
+ if [ $? -ne 0 ]; then
97
+ echo "❌ Falha ao testar conexão com banco!"
98
+ exit 1
99
+ fi
100
+
101
+ echo ""
102
+
103
+ # ============================================================================
104
+ # FASE 5: INICIALIZAR API
105
+ # ============================================================================
106
+ echo "🚀 Iniciando API FastAPI..."
107
+ echo ""
108
+ echo "╔══════════════════════════════════════════════════════════════╗"
109
+ echo "║ API ONLINE ║"
110
+ echo "╚══════════════════════════════════════════════════════════════╝"
111
+ echo ""
112
+ echo "📍 Endpoints disponíveis:"
113
+ echo " • Documentação: http://localhost:$PORT/api/docs"
114
+ echo " • Health Check: http://localhost:$PORT/api/v1/health"
115
+ echo " • Upload: http://localhost:$PORT/api/v1/process/upload"
116
+ echo ""
117
+ echo "💡 PostgreSQL rodando localmente (temporário)"
118
+ echo "⚠️ ATENÇÃO: Dados são perdidos ao reiniciar o container!"
119
+ echo ""
120
+ echo "🔧 Para banco persistente, configure DATABASE_URL nas Secrets"
121
+ echo " Recomendado: Neon (https://neon.tech) ou Supabase"
122
+ echo ""
123
+ echo "=================================================="
124
+ echo ""
125
+
126
+ # Executar comando passado (geralmente uvicorn)
127
+ exec "$@"
init-postgres.sh ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # ============================================================================
3
+ # Script de inicialização do PostgreSQL dentro do container Docker
4
+ # para.AI API v3.0 - Hugging Face Spaces
5
+ # ============================================================================
6
+
7
+ set -e
8
+
9
+ echo "=================================================="
10
+ echo "🐘 Inicializando PostgreSQL local..."
11
+ echo "=================================================="
12
+
13
+ # Variáveis
14
+ POSTGRES_USER="${POSTGRES_USER:-para_ai}"
15
+ POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-para_ai_temp}"
16
+ POSTGRES_DB="${POSTGRES_DB:-para_ai}"
17
+ PGDATA="/var/lib/postgresql/data"
18
+
19
+ # Verificar se já foi inicializado
20
+ if [ -d "$PGDATA/base" ]; then
21
+ echo "✅ PostgreSQL já inicializado (dados existem)"
22
+ else
23
+ echo "📦 Inicializando cluster PostgreSQL..."
24
+
25
+ # Criar diretório de dados
26
+ mkdir -p "$PGDATA"
27
+ chown -R postgres:postgres "$PGDATA"
28
+ chmod 700 "$PGDATA"
29
+
30
+ # Inicializar cluster como usuário postgres
31
+ su - postgres -c "/usr/lib/postgresql/15/bin/initdb -D $PGDATA --encoding=UTF8 --locale=C"
32
+
33
+ echo "✅ Cluster criado"
34
+ fi
35
+
36
+ # Configurar pg_hba.conf para aceitar conexões locais
37
+ cat > "$PGDATA/pg_hba.conf" << EOF
38
+ # TYPE DATABASE USER ADDRESS METHOD
39
+ local all all trust
40
+ host all all 127.0.0.1/32 md5
41
+ host all all ::1/128 md5
42
+ host all all 0.0.0.0/0 md5
43
+ EOF
44
+
45
+ # Configurar postgresql.conf
46
+ cat >> "$PGDATA/postgresql.conf" << EOF
47
+
48
+ # Configurações para ambiente Docker/HF Spaces
49
+ listen_addresses = '*'
50
+ port = 5432
51
+ max_connections = 50
52
+ shared_buffers = 128MB
53
+ work_mem = 4MB
54
+ maintenance_work_mem = 64MB
55
+ effective_cache_size = 256MB
56
+ log_destination = 'stderr'
57
+ logging_collector = off
58
+ log_min_messages = warning
59
+ log_min_error_statement = error
60
+ EOF
61
+
62
+ echo "✅ Configurações aplicadas"
63
+
64
+ # Iniciar PostgreSQL em background
65
+ echo "🚀 Iniciando servidor PostgreSQL..."
66
+ su - postgres -c "/usr/lib/postgresql/15/bin/pg_ctl -D $PGDATA -l /var/log/postgresql/postgresql.log start"
67
+
68
+ # Aguardar PostgreSQL ficar pronto
69
+ echo "⏳ Aguardando PostgreSQL ficar pronto..."
70
+ for i in {1..30}; do
71
+ if su - postgres -c "psql -l" &> /dev/null; then
72
+ echo "✅ PostgreSQL está pronto!"
73
+ break
74
+ fi
75
+ echo " Tentativa $i/30..."
76
+ sleep 1
77
+ done
78
+
79
+ # Verificar se ficou pronto
80
+ if ! su - postgres -c "psql -l" &> /dev/null; then
81
+ echo "❌ PostgreSQL não iniciou corretamente!"
82
+ cat /var/log/postgresql/postgresql.log
83
+ exit 1
84
+ fi
85
+
86
+ # Criar usuário se não existir
87
+ echo "👤 Criando usuário $POSTGRES_USER..."
88
+ 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"
89
+
90
+ # Criar database se não existir
91
+ echo "🗄️ Criando database $POSTGRES_DB..."
92
+ 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"
93
+
94
+ # Dar permissões
95
+ su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE $POSTGRES_DB TO $POSTGRES_USER;\""
96
+
97
+ # Executar DDL se arquivo existir
98
+ if [ -f "/app/database/init_db.sql" ]; then
99
+ echo "📜 Executando DDL..."
100
+ PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -f /app/database/init_db.sql
101
+ echo "✅ DDL executado"
102
+ else
103
+ echo "⚠️ Arquivo init_db.sql não encontrado"
104
+ fi
105
+
106
+ # Executar seed data se arquivo existir
107
+ if [ -f "/app/scripts/seed_data.sql" ]; then
108
+ echo "🌱 Inserindo dados de teste..."
109
+ PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -f /app/scripts/seed_data.sql
110
+ echo "✅ Seed data inserido"
111
+ fi
112
+
113
+ # Mostrar status
114
+ echo ""
115
+ echo "=================================================="
116
+ echo "✅ PostgreSQL inicializado com sucesso!"
117
+ echo "=================================================="
118
+ echo "📊 Informações:"
119
+ echo " Host: localhost"
120
+ echo " Port: 5432"
121
+ echo " Database: $POSTGRES_DB"
122
+ echo " User: $POSTGRES_USER"
123
+ echo ""
124
+
125
+ # Mostrar estatísticas
126
+ echo "📈 Estatísticas:"
127
+ PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -c "
128
+ SELECT
129
+ 'Tribunais' as tabela, COUNT(*)::text as registros FROM tribunais
130
+ UNION ALL
131
+ SELECT 'Usuários', COUNT(*)::text FROM usuarios
132
+ UNION ALL
133
+ SELECT 'Acórdãos', COUNT(*)::text FROM acordaos
134
+ UNION ALL
135
+ SELECT 'Decisões', COUNT(*)::text FROM decisoes;
136
+ " 2>/dev/null || echo " (tabelas ainda não criadas)"
137
+
138
+ echo ""
139
+ echo "✅ Pronto para iniciar API!"
140
+ echo "=================================================="