Add proxymanager

This commit is contained in:
LeoMortari
2025-12-04 22:15:03 -03:00
parent a1eebaf8e1
commit 91f76cea6a
10 changed files with 651 additions and 59 deletions

268
PROXY_INTEGRATION.md Normal file
View File

@@ -0,0 +1,268 @@
# Integração do Sistema de Proxies
Este documento descreve como o sistema de proxies foi integrado à API do YouTube.
## Visão Geral
O sistema de proxies foi implementado para melhorar a confiabilidade da API, usando proxies armazenados em um banco de dados PostgreSQL. Quando um proxy falha, ele é automaticamente removido e outro proxy é testado.
## Arquitetura
### Arquivos Criados
1. **database.py**: Módulo de conexão e operações com PostgreSQL
- `get_db_connection()`: Cria conexão com o banco
- `get_latest_proxy()`: Busca o melhor proxy disponível (baseado em métricas)
- `delete_proxy(proxy_id)`: Marca um proxy como inativo e incrementa failure_count
- `mark_proxy_success(proxy_id)`: Marca sucesso e incrementa success_count
- `format_proxy_url(proxy)`: Formata proxy no padrão yt_dlp (com suporte a autenticação)
2. **proxy_manager.py**: Lógica de retry automático com proxies
- `is_proxy_error(error_msg)`: Identifica se um erro é relacionado a proxy
- `execute_with_proxy_retry()`: Executa operações com retry automático
### Estrutura da Tabela de Proxies
```sql
CREATE TABLE proxies (
id SERIAL PRIMARY KEY,
ip_address VARCHAR(255) NOT NULL,
port INTEGER NOT NULL,
protocol VARCHAR(10) NOT NULL DEFAULT 'http',
username VARCHAR(255), -- Autenticação (opcional)
password VARCHAR(255), -- Autenticação (opcional)
country_code VARCHAR(10), -- Código do país (ex: US, BR)
country_name VARCHAR(100), -- Nome do país
city VARCHAR(100), -- Cidade
is_active BOOLEAN DEFAULT TRUE, -- Proxy está ativo?
is_anonymous BOOLEAN DEFAULT FALSE, -- Proxy é anônimo?
response_time_ms INTEGER, -- Tempo de resposta em ms
last_checked_at TIMESTAMP, -- Última verificação
last_successful_at TIMESTAMP, -- Último sucesso
failure_count INTEGER DEFAULT 0, -- Contador de falhas
success_count INTEGER DEFAULT 0, -- Contador de sucessos
usage VARCHAR(50), -- Uso do proxy
source VARCHAR(100), -- Fonte do proxy
notes TEXT, -- Notas adicionais
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
## Configuração
### 1. Variáveis de Ambiente
Crie um arquivo `.env` baseado no `.env.example`:
```bash
DB_HOST=seu_host_postgresql
DB_PORT=5432
DB_NAME=seu_banco
DB_USER=seu_usuario
DB_PASSWORD=sua_senha
```
### 2. Docker Compose
O `docker-compose.yml` já está configurado para carregar as variáveis de ambiente. Use:
```bash
docker-compose up -d --build
```
## Como Funciona
### Fluxo de Execução
1. **Seleção Inteligente de Proxy**: A cada requisição, o sistema busca o melhor proxy disponível baseado em:
- Proxies ativos (`is_active = TRUE`)
- Último sucesso mais recente (`last_successful_at DESC`)
- Menor tempo de resposta (`response_time_ms ASC`)
- Maior taxa de sucesso (`success_count / (success_count + failure_count)`)
- Mais recentemente adicionado (`created_at DESC`)
2. **Tentativa de Execução**: Tenta executar a operação usando o proxy selecionado
- Suporta autenticação automática se o proxy tiver `username` e `password`
- Formato: `protocol://username:password@ip_address:port`
- **Timeout configurado**: 8 segundos para conexão com proxy
3. **Detecção de Erro**: Se houver erro relacionado a proxy (timeout, connection refused, etc.)
4. **Desativação do Proxy**: O proxy com problema é marcado como inativo
- `is_active = FALSE`
- `failure_count` incrementado
- `last_checked_at` e `updated_at` atualizados
- **Nota**: O proxy NÃO é deletado, apenas desativado
5. **Atualização de Sucesso**: Quando a operação é bem-sucedida
- `success_count` incrementado
- `last_successful_at` atualizado
- `is_active = TRUE` (reativa o proxy se estava inativo)
- `last_checked_at` e `updated_at` atualizados
6. **Retry**: Busca outro proxy ativo e tenta novamente
7. **Limite de Tentativas**: Máximo de 10 tentativas (configurável)
### Performance e Timeout
- **Socket Timeout**: 8 segundos por tentativa de proxy
- **Retry do yt_dlp**: Desabilitado (`retries: 0`)
- **Vantagem**: Ao detectar erro, troca IMEDIATAMENTE de proxy sem tentar novamente no mesmo
- **Comportamento**:
-**ANTES**: Proxy ruim → tenta 3x no mesmo → 24 segundos perdidos → troca
-**AGORA**: Proxy ruim → erro após 8s → remove → busca outro → 8 segundos
- **Tempo máximo de espera**: ~80 segundos (10 proxies × 8 segundos cada)
- **Nota**: Se precisar de timeout diferente, altere `socket_timeout` nas opções do yt_dlp
### Palavras-chave de Erro de Proxy
O sistema identifica erros de proxy por estas palavras-chave:
- proxy
- connection
- timeout
- timed out
- refused
- unreachable
- unable to connect
- network
- failed to connect
- connection reset
- read timed out
- http error 407 (proxy authentication)
- tunnel connection failed
### Erros NÃO Tratados como Proxy
Estes erros NÃO resultam em troca de proxy (são erros legítimos do vídeo):
- "requested format is not available" - Formato solicitado não existe
- "video unavailable" - Vídeo indisponível/removido
- "private video" - Vídeo privado
- "age restricted" - Vídeo com restrição de idade
Quando esses erros ocorrem, o sistema **não** descarta o proxy e retorna o erro imediatamente.
### Endpoints Integrados
Todos os endpoints que usam yt_dlp foram integrados:
1. **GET /get-video-metadata**: Obtém metadados de vídeos
2. **GET /download-video**: Download de vídeos
3. **GET /search**: Busca de vídeos
4. **GET /list-formats**: Lista formatos disponíveis
### Tratamento de Erros
- **ProxyError (503)**: Todos os proxies falharam ou não há proxies disponíveis
- **Exception (500)**: Erros não relacionados a proxy
## Alimentando o Banco de Proxies
Para adicionar proxies ao banco, você pode usar o serviço de scraper de proxies que já foi criado.
### Exemplos de Inserção Manual
**Proxies sem autenticação:**
```sql
INSERT INTO proxies (ip_address, port, protocol, is_active, is_anonymous, country_code)
VALUES
('123.456.789.10', 8080, 'http', TRUE, FALSE, 'US'),
('98.765.432.10', 3128, 'https', TRUE, TRUE, 'BR'),
('45.67.89.100', 1080, 'socks5', TRUE, TRUE, 'DE');
```
**Proxies com autenticação:**
```sql
INSERT INTO proxies (ip_address, port, protocol, username, password, is_active)
VALUES
('premium-proxy.example.com', 8080, 'http', 'user123', 'pass456', TRUE),
('secure-proxy.example.com', 3128, 'https', 'myuser', 'mypass', TRUE);
```
### Integração com Scraper
Quando o serviço de scraper adicionar novos proxies, deve incluir:
- `ip_address`, `port`, `protocol` (obrigatórios)
- `country_code`, `country_name`, `city` (se disponível)
- `is_anonymous` (se detectado)
- `response_time_ms` (tempo de resposta inicial)
- `source` (fonte do scraper)
- `is_active = TRUE` por padrão
## Monitoramento
O sistema imprime logs úteis no console:
```
Tentativa 1: Usando proxy http://41.65.160.173:8080 (ID: 42)
Erro na tentativa 1: Connection to 41.65.160.173 timed out
Erro identificado como erro de proxy. Removendo proxy ID 42
Proxy 42 desativado: True
Tentativa 2: Usando proxy http://98.765.432.10:3128 (ID: 43)
Operação concluída com sucesso na tentativa 2
Proxy (id 43) marcado como sucesso
```
**Importante**: Não haverá mais mensagens como "Retrying (1/3)..." porque desabilitamos o retry interno do yt_dlp. Cada erro resulta em troca imediata de proxy.
## Vantagens
1. **Alta Disponibilidade**: Se um proxy falhar, outro é usado automaticamente
2. **Seleção Inteligente**: Proxies são escolhidos baseado em performance e histórico
3. **Auto-recuperação**: Proxies são desativados quando falham, mas podem ser reativados em sucesso futuro
4. **Métricas Automáticas**: Sistema rastreia sucesso/falha e tempo de resposta automaticamente
5. **Suporte a Autenticação**: Proxies com username/password são suportados automaticamente
6. **Sem Intervenção Manual**: O sistema gerencia proxies de forma autônoma
7. **Preservação de Dados**: Proxies não são deletados, apenas desativados
8. **Fácil Integração**: Novo serviço de scraper pode adicionar proxies facilmente
## Monitoramento e Análise
### Queries Úteis
**Ver estatísticas de proxies:**
```sql
SELECT
COUNT(*) as total,
COUNT(*) FILTER (WHERE is_active = TRUE) as ativos,
COUNT(*) FILTER (WHERE is_active = FALSE) as inativos,
AVG(response_time_ms) as tempo_resposta_medio,
SUM(success_count) as total_sucessos,
SUM(failure_count) as total_falhas
FROM proxies;
```
**Ver top 10 melhores proxies:**
```sql
SELECT
ip_address, port, protocol,
success_count, failure_count,
ROUND((success_count::FLOAT / NULLIF(success_count + failure_count, 0) * 100), 2) as taxa_sucesso,
response_time_ms,
last_successful_at
FROM proxies
WHERE is_active = TRUE
ORDER BY
last_successful_at DESC NULLS LAST,
response_time_ms ASC NULLS LAST
LIMIT 10;
```
**Reativar proxies desativados há mais de 24h (útil para retry):**
```sql
UPDATE proxies
SET is_active = TRUE, updated_at = NOW()
WHERE is_active = FALSE
AND updated_at < NOW() - INTERVAL '24 hours';
```
## Próximos Passos Sugeridos
1. ✅ Integrar com o serviço de scraper de proxies
2. ✅ Implementar métricas de sucesso/falha por proxy (CONCLUÍDO)
3. ✅ Implementar sistema de priorização de proxies (CONCLUÍDO)
4. Criar endpoint de administração para visualizar estatísticas de proxies
5. Implementar job periódico para reativar proxies após período de cooldown
6. Adicionar alertas quando número de proxies ativos cair abaixo de threshold