## CONTEXTO COMPLETO: MI SERVIDOR DOMÉSTICO E INFRAESTRUCTURA Soy un maker/developer con un servidor casero. Esto es TODO lo que tengo montado, para que entiendas mi setup y puedas asesorarme sobre ideas/proyectos futuros, decirme si son viables, cómo enfocarlos, etc. --- ### 1. HARDWARE - **Mini PC**: Minisforum UM880 Plus - **CPU**: AMD Ryzen 7 8845HS (8 cores, 16 threads) - **RAM**: 32 GB - **Almacenamiento**: 1 TB SSD - **SO**: Linux Mint 24 - **Ubicación**: En mi casa (no cloud, no VPS) --- ### 2. ARQUITECTURA DE RED ``` Internet → Cloudflare Tunnel (cloudflared) → localhost:80 → Caddy → servicios Docker ``` - Cloudflare maneja TLS/SSL en el edge (certificados automáticos) - Caddy recibe HTTP plano en :80 - DNS: wildcard *.wahandri.com apuntando a Cloudflare - Sin puertos abiertos directamente a internet (solo el tunnel) - UFW: solo 22, 80, 443 abiertos localmente - fail2ban en SSH y Caddy - SSH solo con claves, sin password, sin root - Basic Auth con usuario "wahandri" para paneles sensibles - API Key via header X-Api-Key para comunicaciones entre servicios internos --- ### 3. DOMINIOS Y SERVICIOS PÚBLICOS | Servicio | URL | Puerto interno | Auth | |----------|-----|---------------|------| | Dashboard admin | https://servidor.wahandri.com | :3000 / :8000 | Basic Auth | | API Central (FastAPI) | https://api.wahandri.com | :8000 | API Key | | NOVA WebSocket (app) | https://nova-api.wahandri.com | :8010 | API Key | | FileBrowser / APK | https://compartida.wahandri.com | :8081 | - | | EconomIA API | https://economia-api.wahandri.com | :18765 | - | | EconomIA dashboard | https://economia.wahandri.com | :18766 | Basic Auth | | Ollama (LLM local) | https://ollama.wahandri.com | :11434 | Basic Auth | | BOE LeyAbierta | https://boe.wahandri.com | :3001 | API Key | | BOE (dominio propio) | https://leyabierta.com / letabierta.com | :3001 | - | | I Ching oráculo | https://iching.wahandri.com | :8002 | - | | Música IA | https://musica.wahandri.com | :8005 / :3010 | Basic Auth | | AutoContent Studio | https://autocontent.wahandri.com | :7860 | Basic Auth | | Terminal web | https://terminal.wahandri.com | :7681 / :8000 | Cloudflare Access | | SSH | ssh.wahandri.com | :22 | Solo claves | | All2Red (alertas fútbol) | (local 192.168.1.7:8001) | :8001 | contraseña | --- ### 4. CONTENEDORES DOCKER (todos en docker-compose) El compose está en /opt/server/docker-compose.yml. Todos en network_mode host. | Contenedor | Puerto | Función | |------------|--------|---------| | cloudflared | - | Tunnel Cloudflare | | caddy | 80/443 | Reverse proxy | | mariadb | 3306 | Base de datos MariaDB | | api | 8000 | API Central FastAPI | | dashboard | 3000 | Panel web admin estático | | assistant-bot | - | Bot Telegram NOVA (@novandri_bot) | | nova-ws | 8010 | WebSocket server para app Android | | imagine | 8007 | Generación imágenes LCM | | iching-api | 8002 | Oráculo I Ching | | boe | 8004 | BOE LeyAbierta (scraping + LLM) | | leyabierta-web | 3001 | Frontend BOE | | economia | 18765 | Backend EconomIA | | economia-dashboard | 18766 | Frontend EconomIA | | musica-ia | 8005 | Generación música IA | | musica-ia-dashboard | 3010 | Dashboard música IA | | autocontent | 7860 | AutoContent Studio | | ttyd | 7681 | Terminal web | | filebrowser | 8081 | Gestor archivos web | | nextcloud | 8082 | Nube personal | Además, tengo estos directorios de apps (algunas no están en docker-compose activo o están en desarrollo): - ark/ → Servidor de juego ARK: Survival Evolved - all2red-web/ → PWA de alertas de expulsiones de fútbol - comfyui/ → Generación imágenes IA (ComfyUI) - fooocus/ → Generación imágenes IA (Fooocus) - home/ → Página de inicio wahandri.com --- ### 5. ESTRUCTURA DE DIRECTORIOS ``` /opt/server/ ├── apps/ │ ├── api/ # FastAPI central (puerto 8000) │ ├── dashboard/ # Panel web admin │ ├── boe/ (ley_abierta/) # BOE LeyAbierta (scraping + LLM) │ ├── economia/ # EconomIA backend │ ├── economia-dashboard/ # EconomIA frontend │ ├── iching/ # I Ching API (8002) │ ├── assistant-bot/ # Bot Telegram NOVA │ │ ├── main.py # ~1369 líneas, bot + tools │ │ ├── Dockerfile │ │ └── requirements.txt │ ├── nova-ws/ # WebSocket API NOVA (8010) │ │ ├── main.py # ~1320 líneas, WS + tools │ │ ├── Dockerfile │ │ └── requirements.txt │ ├── imagine/ # Generación imágenes LCM (8007) │ ├── comfyui/ # ComfyUI │ ├── fooocus/ # Fooocus │ ├── ark/ # Servidor ARK │ ├── all2red-web/ # Alertas fútbol │ ├── ttyd/ # Terminal web │ ├── filebrowser/ # Config FileBrowser │ └── home/ # Landing page ├── nova-app/ # App Android Flutter │ └── lib/ │ ├── main.dart │ ├── globals.dart │ ├── screens/ # Login, Chat, Settings │ ├── services/ # WebSocket, Settings, Alarm │ └── widgets/ # ChatBubble, MessageInput ├── data/mariadb/ # Datos MariaDB ├── backups/ # Backups del servidor ├── compartida/ # Archivos descargables (APK, logos) ├── caddy/ # Datos Caddy ├── cloudflared/ # Config tunnel │ └── config.yml # → Editar para nuevo subdominio ├── docker-compose.yml # → Composición principal ├── Caddyfile # → Editar también para subdominios ├── .env # Variables sensibles ├── AGENTS.md # Contexto para agentes IA └── servidor # Panel TUI (script bash) ``` --- ### 6. NOVA — MI ASISTENTE IA PERSONAL Es el proyecto estrella. Tengo dos implementaciones con la misma lógica pero por separado: #### 6a. Telegram Bot (assistant-bot) - Usuario: @novandri_bot - Responde a texto y notas de voz - System prompt: se llama WAHA (en el bot) / NOVA (en WS) - Herramientas: estado servidor, Docker, DB, backups, Polymarket, BOE, I Ching, web search, fetch_url, generate_image, notas, recordatorios - Comandos: /start, /help, /new, /memory, /forget, /status, /services, /backup, /boe, /imagen, /iching, /buscar, /nota, /notas, /recordatorio, /recordatorios - Background tasks: check_reminders(), keep_warm() #### 6b. WebSocket API (nova-ws) + App Android (Flutter) - App Flutter que conecta via WebSocket a wss://nova-api.wahandri.com/ws/chat - Autenticación: API Key del servidor - Sidebar con accesos directos (Estado, Polymarket, BOE, etc.) - Settings con selector de motor (DeepSeek/Ollama) - Historial persistente en el móvil (SharedPreferences) - Alarmas con sonido en loop - APK disponible en: https://compartida.wahandri.com/nova.apk #### 6c. Motores de IA | Motor | Velocidad | Requisitos | |-------|-----------|------------| | DeepSeek (default) | ~1-3s | Internet + API Key | | Ollama (local) | ~5-80s | llama3.1:8b en localhost:11434 | #### 6d. Tools disponibles (26 herramientas en total) **Servidor**: get_system_status, list_services, service_action, get_service_logs, docker_ps, docker_compose_action, query_database, create_backup, list_backups, run_command, process_list, network_info **Archivos**: read_file, list_directory, search_files, grep_files **Productividad**: web_search, fetch_url, create_note, list_notes, delete_note, search_notes, create_reminder, list_reminders, delete_reminder, save_user_fact, delete_user_fact, list_user_facts, get_weather, translate **BOE**: search_boe, get_boe_document, boe_stats **Media**: generate_image (LCM en :8007), text_to_speech (espeak), iching_reading **Coder (opencode)**: start_coding_session, send_prompt_to_coder, get_coder_output, stop_coding_session #### 6e. Flujo Coder (opencode) Cuando pido cambios de código: 1. NOVA traduce mi petición a prompt técnico 2. Lanza opencode en el directorio del proyecto 3. opencode explora el código, hace cambios, etc. 4. Si opencode pregunta algo, NOVA me relayea y yo respondo 5. Al terminar, cierra la sesión #### 6f. Chat persistente Las conversaciones se guardan en MariaDB (tabla conversations). Al reconectar se carga el historial. Botón "Nueva conversación" para reiniciar. --- ### 7. PROYECTOS ESPECÍFICOS #### 7a. Polymarket Agent (trading de predicciones) - Bot automatizado de trading en Polymarket - Estrategias: directional + market making - Modo: paper trading (dry run), PAPER_MODE=true, DRY_RUN=true - Capital simulado: 500 USDC - Máx 2 posiciones concurrentes de 35 USDC cada una - Stop loss: 5% drawdown en 7 días - Análisis de mercados con DeepSeek + noticias - Datos en MariaDB - Dashboard en :8300 #### 7b. BOE LeyAbierta - Scraper del Boletín Oficial del Estado - Análisis de documentos con LLM (DeepSeek) - Búsqueda por: fecha, tema, tipo, impacto, afectados - API + frontend web - Dos dominios: boe.wahandri.com y leyabierta.com #### 7c. EconomIA - Plataforma de análisis económico - API con datos económicos - Dashboard con gráficos - WebSocket para datos en tiempo real #### 7d. Música IA - Generación musical con modelos de IA - API para: entrenar modelos, generar música, restyling - Dashboard para visualización #### 7e. Generación de imágenes - imagine: LCM (Latent Consistency Models) — generación rápida (~1-2s) - ComfyUI: generación más compleja con nodos - Fooocus: generación estilo Midjourney - Estilos: realistic, anime, cinematic, fantasy #### 7f. I Ching - Oráculo chino digital - Genera hexagramas aleatorios - Interpretación via LLM (Ollama/DeepSeek) - API REST en :8002 #### 7g. AutoContent Studio - Plataforma de creación de contenido automatizada - Interfaz Gradio en :7860 #### 7h. All2Red (alertas fútbol) - PWA para alertas de expulsiones en partidos de fútbol - Conexión WebSocket a servidor en 192.168.1.7:8001 - Ligas configuradas: LaLiga, Champions, Premier, Serie A, Bundesliga, Ligue 1, Eredivisie, Primeira, Championship #### 7i. ARK Server - Servidor de juego ARK: Survival Evolved - Puerto: (no especificado en compose, usa network_mode host) - Mapa: Fjordur - Máx 6 jugadores #### 7j. Nextcloud - Nube personal - Puerto: 8082 - Base de datos: MariaDB - Límite upload: 10 GB - Memoria PHP: 1 GB --- ### 8. SEGURIDAD - UFW: solo 22 (SSH), 80 (HTTP local), 443 (HTTPS local) - fail2ban configurado para SSH y Caddy - SSH: solo autenticación por clave, sin password, sin login root - sudo requiere contraseña - Basic Auth (Caddy) para rutas sensibles — usuario: wahandri - API Key (X-Api-Key header) para comunicaciones entre servicios - Cloudflare Tunnel: sin exposición directa de puertos a internet - .env con variables sensibles (DB passwords, API keys, tokens) --- ### 9. APIs Y CONFIGURACIONES CLAVE - **API Key del servidor**: 0ce8a0e1-96a4-43b9-a8a4-21e505ec0042 - **DeepSeek API Key**: en .env como DEEPSEEK_API_KEY - **MariaDB**: bind a 127.0.0.1:3306, max binlog 100M, max packet 64M - **Caddy**: recarga sin downtime con `docker exec caddy caddy reload --config /etc/caddy/Caddyfile` - **Backups**: script en /opt/server/backup.sh --- ### 10. COMANDOS ÚTILES FRECUENTES ```bash # Logs docker logs -f assistant-bot docker logs -f nova-ws docker logs -f caddy # Rebuild + restart docker compose -f /opt/server/docker-compose.yml up -d --build # Compilar APK export ANDROID_HOME=/tmp/android-sdk export PATH="/tmp/flutter/bin:$PATH" cd /opt/server/nova-app && flutter build apk --debug cp build/app/outputs/flutter-apk/app-debug.apk /opt/server/compartida/nova.apk # Recargar Caddy docker exec caddy caddy reload --config /etc/caddy/Caddyfile # Tunnel docker restart cloudflared # Añadir nuevo subdominio (hay que hacerlo en DOS sitios): # 1) /opt/server/cloudflared/config.yml (meter hostname en ingress) # 2) /opt/server/Caddyfile (meter ruteo en :80 y :443) # 3) docker restart cloudflared && docker exec caddy caddy reload ``` --- ### 11. SOBRE MÍ (para que me aconsejes bien) - Soy desarrollador, me gusta hacer más que planificar demasiado - Hablo español (castellano) - Todo corre en mi máquina local — me gusta tener el control - Ya tengo IA local (Ollama) y en cloud (DeepSeek) - Uso opencode como asistente de codificación - Mis áreas: trading algorítmico, scraping, generación de contenido, bots, IA - Cuando tengo una idea nueva, antes de meterme a codificar quiero contrastarla con alguien que entienda mi contexto --- Con todo esto ya tienes una foto completa de mi setup. Ahora puedo preguntarte cosas como: - "Se me ocurre montar [X], ¿tiene sentido con lo que ya tengo?" - "¿Cómo enfocarías [Y] en mi infraestructura?" - "¿Qué servicio de los que tengo podría mejorar o integrar con [Z]?" - "¿Es viable [idea] técnicamente y merece la pena?"