Spaces:
Runtime error
Runtime error
ParaAIV3.0
Browse files- Dockerfile +73 -24
- README.md +195 -1
- docker-entrypoint.sh +127 -0
- 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 |
-
#
|
| 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 |
-
|
| 21 |
-
|
| 22 |
-
PORT=7860
|
| 23 |
|
| 24 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
RUN apt-get update && apt-get install -y \
|
|
|
|
| 26 |
gcc \
|
| 27 |
g++ \
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
curl \
|
|
|
|
|
|
|
| 31 |
&& rm -rf /var/lib/apt/lists/*
|
| 32 |
|
| 33 |
-
#
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
| 35 |
|
| 36 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
RUN pip install --no-cache-dir -r requirements.txt
|
| 38 |
|
| 39 |
-
#
|
|
|
|
|
|
|
| 40 |
COPY . .
|
| 41 |
|
| 42 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
RUN mkdir -p /app/data/uploads \
|
| 44 |
/app/data/outputs \
|
| 45 |
/app/data/temp \
|
| 46 |
/app/data/backups \
|
| 47 |
-
/app/logs
|
|
|
|
| 48 |
|
| 49 |
-
#
|
| 50 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
|
| 52 |
-
#
|
| 53 |
-
|
|
|
|
|
|
|
| 54 |
CMD curl -f http://localhost:7860/api/v1/health || exit 1
|
| 55 |
|
| 56 |
-
# Expor
|
| 57 |
EXPOSE 7860
|
|
|
|
| 58 |
|
| 59 |
-
#
|
| 60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 "=================================================="
|