Add proxymanager
This commit is contained in:
268
PROXY_INTEGRATION.md
Normal file
268
PROXY_INTEGRATION.md
Normal 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
|
||||
Reference in New Issue
Block a user