feat(phase-1): Complete foundation setup

- Add User model and authentication system with JWT cookies
- Implement login/logout routes and protected dashboard
- Add Alembic database migration configuration
- Add create_admin.py script for initial user setup
- Make ContentGenerator and ImageGenerator lazy-initialized
- Add comprehensive API keys setup documentation
- Fix startup errors when services unavailable

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-28 01:30:15 +00:00
parent 049d2133f9
commit 541a8484a7
14 changed files with 1092 additions and 18 deletions

309
docs/API_KEYS_SETUP.md Normal file
View File

@@ -0,0 +1,309 @@
# Guía de Configuración de API Keys
Esta guía detalla el proceso para obtener las credenciales necesarias para cada plataforma.
## Tabla de Contenidos
1. [X (Twitter) Developer](#x-twitter-developer)
2. [Meta Developer (Facebook, Instagram, Threads)](#meta-developer)
3. [DeepSeek API](#deepseek-api)
4. [Configuración en el Sistema](#configuración-en-el-sistema)
---
## X (Twitter) Developer
### Paso 1: Crear cuenta de desarrollador
1. Visita [developer.twitter.com](https://developer.twitter.com/)
2. Inicia sesión con tu cuenta de X/Twitter
3. Haz clic en "Sign up for Free Account" o "Apply for access"
### Paso 2: Crear un Proyecto y App
1. En el Dashboard, ve a **Projects & Apps** > **Overview**
2. Crea un nuevo proyecto:
- Nombre: `Consultoria-AS-Social-Automation`
- Caso de uso: `Making a bot` o `Building tools for Twitter users`
3. Dentro del proyecto, crea una App:
- Nombre: `social-media-automation`
### Paso 3: Configurar permisos
1. En la configuración de la App, ve a **User authentication settings**
2. Configura:
- **App permissions**: Read and Write
- **Type of App**: Web App, Automated App or Bot
- **Callback URL**: `https://tu-dominio.com/callback` (o `http://localhost:8000/callback` para desarrollo)
- **Website URL**: `https://consultoria-as.com`
### Paso 4: Obtener credenciales
En la sección **Keys and Tokens**, genera y guarda:
| Credencial | Variable de Entorno |
|------------|---------------------|
| API Key | `TWITTER_API_KEY` |
| API Key Secret | `TWITTER_API_SECRET` |
| Access Token | `TWITTER_ACCESS_TOKEN` |
| Access Token Secret | `TWITTER_ACCESS_TOKEN_SECRET` |
| Bearer Token | `TWITTER_BEARER_TOKEN` |
> **Importante**: El plan gratuito permite 1,500 tweets/mes. Para más volumen, considera el plan Basic ($100/mes) con 3,000 tweets/mes.
---
## Meta Developer
Meta maneja Facebook, Instagram y Threads desde el mismo portal de desarrolladores.
### Paso 1: Crear cuenta de desarrollador
1. Visita [developers.facebook.com](https://developers.facebook.com/)
2. Inicia sesión con tu cuenta de Facebook
3. Acepta los términos de desarrollador
### Paso 2: Crear una App
1. Ve a **My Apps** > **Create App**
2. Selecciona tipo de app: **Business**
3. Configura:
- Nombre: `Consultoria-AS-Social-Automation`
- Contacto: tu email
- Business Account: selecciona o crea una
### Paso 3: Agregar productos
En el dashboard de tu app, agrega estos productos:
#### Para Facebook Pages:
1. Añade el producto **Facebook Login for Business**
2. Añade **Pages API**
3. Configura los permisos:
- `pages_manage_posts`
- `pages_read_engagement`
- `pages_show_list`
#### Para Instagram:
1. Añade el producto **Instagram Graph API**
2. Permisos necesarios:
- `instagram_basic`
- `instagram_content_publish`
- `instagram_manage_comments`
- `instagram_manage_insights`
#### Para Threads:
1. Añade el producto **Threads API**
2. Permisos necesarios:
- `threads_basic`
- `threads_content_publish`
- `threads_manage_replies`
### Paso 4: Conectar cuentas
1. Ve a **Settings** > **Basic** para obtener:
- App ID → `META_APP_ID`
- App Secret → `META_APP_SECRET`
2. Para Facebook Page:
- Ve a **Tools** > **Graph API Explorer**
- Selecciona tu app y página
- Genera un Page Access Token con los permisos necesarios
- Convierte a Long-Lived Token (60 días)
3. Para Instagram:
- La cuenta de Instagram debe estar conectada a una Facebook Page
- Ve a Graph API Explorer
- Obtén el Instagram Business Account ID
- Genera Access Token con permisos de Instagram
### Paso 5: Obtener tokens de larga duración
```bash
# Convertir token de corta a larga duración (60 días)
curl -X GET "https://graph.facebook.com/v18.0/oauth/access_token?grant_type=fb_exchange_token&client_id={APP_ID}&client_secret={APP_SECRET}&fb_exchange_token={SHORT_LIVED_TOKEN}"
```
| Credencial | Variable de Entorno |
|------------|---------------------|
| App ID | `META_APP_ID` |
| App Secret | `META_APP_SECRET` |
| Page Access Token | `FACEBOOK_PAGE_ACCESS_TOKEN` |
| Page ID | `FACEBOOK_PAGE_ID` |
| Instagram User ID | `INSTAGRAM_USER_ID` |
| Threads User ID | `THREADS_USER_ID` |
> **Nota**: Los tokens de Meta expiran. Implementa un sistema de refresh o regenera manualmente cada 60 días.
---
## DeepSeek API
### Paso 1: Crear cuenta
1. Visita [platform.deepseek.com](https://platform.deepseek.com/)
2. Regístrate con email o Google
3. Verifica tu cuenta
### Paso 2: Obtener API Key
1. Ve a **API Keys** en el dashboard
2. Crea una nueva API Key
3. Copia y guarda la key (solo se muestra una vez)
### Paso 3: Agregar créditos
1. Ve a **Billing** > **Top Up**
2. Agrega créditos (mínimo $5 USD recomendado para empezar)
3. Los precios son muy económicos (~$0.14/1M tokens input, ~$0.28/1M tokens output)
| Credencial | Variable de Entorno |
|------------|---------------------|
| API Key | `DEEPSEEK_API_KEY` |
| Base URL | `https://api.deepseek.com` (ya configurado por defecto) |
---
## Configuración en el Sistema
### Archivo `.env`
Crea el archivo `.env` en la raíz del proyecto:
```env
# ==============================================
# BASE DE DATOS
# ==============================================
DATABASE_URL=postgresql://postgres:tu_password@localhost:5432/social_automation
REDIS_URL=redis://localhost:6379/0
# ==============================================
# SEGURIDAD
# ==============================================
SECRET_KEY=genera-una-clave-segura-de-32-caracteres-minimo
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
# ==============================================
# X (TWITTER) API
# ==============================================
TWITTER_API_KEY=tu_api_key
TWITTER_API_SECRET=tu_api_secret
TWITTER_ACCESS_TOKEN=tu_access_token
TWITTER_ACCESS_TOKEN_SECRET=tu_access_token_secret
TWITTER_BEARER_TOKEN=tu_bearer_token
# ==============================================
# META APIs (Facebook, Instagram, Threads)
# ==============================================
META_APP_ID=tu_app_id
META_APP_SECRET=tu_app_secret
# Facebook
FACEBOOK_PAGE_ACCESS_TOKEN=tu_page_access_token
FACEBOOK_PAGE_ID=tu_page_id
# Instagram
INSTAGRAM_USER_ID=tu_instagram_user_id
INSTAGRAM_ACCESS_TOKEN=tu_instagram_access_token
# Threads
THREADS_USER_ID=tu_threads_user_id
THREADS_ACCESS_TOKEN=tu_threads_access_token
# ==============================================
# DEEPSEEK API (Generación de contenido)
# ==============================================
DEEPSEEK_API_KEY=tu_deepseek_api_key
DEEPSEEK_BASE_URL=https://api.deepseek.com
# ==============================================
# CONFIGURACIÓN DE NEGOCIO
# ==============================================
BUSINESS_NAME=Consultoría AS
BUSINESS_DESCRIPTION=Consultoría tecnológica y venta de equipos de cómputo e impresión 3D
BUSINESS_WEBSITE=https://consultoria-as.com
BUSINESS_LOCATION=Tijuana, México
```
### Generar SECRET_KEY
```bash
# Usando Python
python -c "import secrets; print(secrets.token_urlsafe(32))"
# Usando OpenSSL
openssl rand -base64 32
```
### Verificar configuración
Después de configurar el `.env`, verifica que todo esté correcto:
```bash
# Activar entorno virtual
source venv/bin/activate
# Verificar que las variables se cargan
python -c "from app.core.config import settings; print('DB:', settings.DATABASE_URL[:20] + '...'); print('DeepSeek:', 'OK' if settings.DEEPSEEK_API_KEY else 'NO CONFIGURADO')"
```
---
## Límites de API y Costos Estimados
### X (Twitter)
| Plan | Tweets/mes | Costo |
|------|-----------|-------|
| Free | 1,500 | $0 |
| Basic | 3,000 | $100/mes |
| Pro | 300,000 | $5,000/mes |
### Meta (Facebook/Instagram/Threads)
- Sin límite de publicaciones para cuentas propias
- Rate limits: ~200 llamadas/hora por usuario
- Costo: Gratuito
### DeepSeek
| Modelo | Input | Output |
|--------|-------|--------|
| deepseek-chat | $0.14/1M tokens | $0.28/1M tokens |
| deepseek-coder | $0.14/1M tokens | $0.28/1M tokens |
**Estimación mensual**: ~$5-10 USD para 300 posts/mes
---
## Solución de Problemas
### Error: "Invalid API Key" en X
1. Verifica que copiaste la key completa
2. Regenera las credenciales si es necesario
3. Asegúrate de que la app tiene permisos de escritura
### Error: "Token expired" en Meta
1. Los tokens de página expiran cada 60 días
2. Usa el Graph API Explorer para generar uno nuevo
3. Considera implementar refresh automático
### Error: "Insufficient balance" en DeepSeek
1. Agrega más créditos en el dashboard
2. Verifica el consumo en la sección de billing
---
## Próximos Pasos
1. Configura las credenciales en `.env`
2. Ejecuta `docker-compose up -d` para iniciar servicios
3. Crea el usuario admin: `python scripts/create_admin.py`
4. Accede al dashboard: `http://localhost:8000/dashboard`
5. Configura el calendario de contenido
Para más información, consulta la [documentación principal](./README.md).