World Monitor autohospedado: Docker, Ollama, PMTiles e inteligencia sin conexión

Despliega World Monitor desde el código fuente o Docker, conecta Ollama, sirve PMTiles sin conexión y revisa dependencias externas, caché y fallos de despliegue.

World Monitor es un panel en tiempo real que agrega noticias, mercados, aviación, riesgo geográfico, infraestructura y datos de inteligencia pública. Agregó alrededor de 13,231 estrellas en GitHub Trending en una semana, pero “puede abrir la interfaz” y “ejecutarse completamente sin conexión” son dos objetivos de implementación diferentes. Este artículo primero separa los componentes y las dependencias de la red, y luego proporciona tres rutas verificables para el desarrollo del código fuente, el front-end del contenedor y el resumen de la IA local.

Primero decida qué nivel de implementación fuera de línea desea implementar

La documentación del proyecto describe tres categorías de modelos de privacidad. Lo más sencillo es abrir la aplicación localmente, pero continuar solicitando la API pública y el LLM en la nube. El segundo tipo es cooperar con Ollama, LM Studio, llama.cpp o vLLM en el escritorio, de modo que el resumen de noticias permanezca en la máquina local y otras fuentes de datos permanezcan en línea. La tercera categoría son las redes aisladas: modelos locales, PMTiles locales, instantáneas de datos preparadas previamente y desactivación de fuentes externas en vivo. La tercera categoría no se puede hacer automáticamente con un contenedor Docker porque los vuelos, los mercados, los RSS y las fuentes de riesgos deben actualizarse. Antes de comenzar, escriba un resumen de los nombres de dominio a los que se permite acceder, los requisitos de tiempo de actualización de datos y si se permite la nube.

Los componentes en ejecución de World Monitor no son solo páginas web

La interfaz es una aplicación Vanilla TypeScript y el mapa se representa mediante componentes como MapLibre GL, deck.gl y Globe.gl. La parte del servidor incluye el controlador Edge, la puerta de enlace RPC, la caché y las tareas de inicialización de datos. AIS Relay es responsable de algunos datos periódicos y de transmisión en tiempo real. Redis se utiliza para almacenar en caché, limitar y evitar que múltiples solicitudes actualicen los mismos datos al mismo tiempo. El escritorio usa Tauri con el sidecar Node.js. PMTiles puede colocar mapas base en almacenamiento de objetos o servicios LAN HTTP. Por lo tanto, el autohospedaje debe aclarar qué componentes se ejecutan por sí mismos y cuáles continúan tomando prestados servicios ascendentes.

Licencia antes del modo de implementación

El repositorio es AGPL-3.0 con instrucciones adicionales para uso comercial. El uso personal, de investigación y educativo puede ser autohospedado sujeto a condiciones de atribución y licencia. SaaS comercial, cambio de marca o reempaquetado requiere verificar los requisitos de licencia comercial del proyecto. No entienda que “el código se puede descargar públicamente” significa que se puede vender incondicionalmente como fuente cerrada. Cuando planee proporcionar servicios externos, primero lea los formularios de permiso LICENSE y README en el repositorio.

Prepare el Nodo 22 y las herramientas básicas

El registro de cambios del proyecto ha fijado el Nodo 22 como línea base de desarrollo. Se recomienda utilizar WSL2 Ubuntu en Windows, Linux y macOS pueden operar directamente.

1
2
3
4
node --version
npm --version
git --version
make --version

Cuando la versión principal de Node no sea 22, use nvm para cambiar:

1
2
3
nvm install 22
nvm use 22
node --version

No mezcle paquetes globales entre nodos del sistema y nodos nvm.

Inicie el panel de desarrollo completo desde el código fuente

Primera bifurcación o clonación directa del repositorio oficial:

1
2
3
git clone https://github.com/koala73/worldmonitor.git
cd worldmonitor
git rev-parse HEAD

Guarde el SHA de confirmación y los cambios posteriores en el documento y la configuración se remontarán a la versión específica. El documento de contribución oficial proporciona un objetivo de instalación unificado:

1
make install

Preparará buf, el complemento sebuf, las dependencias npm y el navegador Playwright. Para ver solo la ayuda ejecute:

1
make help

Servidor de desarrollo para la variante completa:

1
npm run dev

La dirección predeterminada es http://localhost:3000.

Variantes diferentes no son repositorios diferentes

Paneles de control de World Monitor, capas de mapas, ciclos de actualización y fuentes de datos predeterminadas mediante variante. Los paneles Tecnología, Finanzas y Completo se pueden iniciar por separado:

1
2
npm run dev:tech
npm run dev:finance

La compilación de producción también tiene un comando correspondiente:

1
2
3
npm run build
npm run build:tech
npm run build:finance

Al cambiar de variante se restablecerán algunas configuraciones. No trate el almacenamiento local de diferentes variantes del navegador como la misma configuración.

Las variables de entorno se activan una por una según la fuente de datos

Copie el archivo de muestra:

1
cp .env.example .env.local

No complete todas las claves API a la vez. Comience con el panel que no requiere credenciales y confirme que la interfaz, el mapa y el RPC básico estén funcionando. Agregue noticias, mercados, vuelos o proveedores de LLM uno por uno. Cada vez que se agrega una variable, el servicio se reinicia y se verifican las solicitudes de red. .env.local no ingresa a Git:

1
2
git status --short
git check-ignore .env.local

Si el segundo elemento no aparece, verifique primero .gitignore y no continúe completando la clave real.

Ruta Docker para la interfaz alojada

docker/Dockerfile en el repositorio crea una imagen de arquitectura múltiple, nginx proporciona SPA y envía solicitudes de API al nivel ascendente. Construya localmente primero:

1
2
docker build -f docker/Dockerfile -t worldmonitor:local .
docker image inspect worldmonitor:local

Verifique el puerto expuesto de Dockerfile y la configuración de nginx antes de ejecutar. No adivines el puerto:

1
2
docker image inspect worldmonitor:local \
  --format '{{json .Config.ExposedPorts}}'

Suponiendo una exposición de imagen de 80, prueba de mapeo de solo bucle invertido disponible:

1
2
3
docker run --rm --name worldmonitor-test \
  -p 127.0.0.1:8080:80 \
  worldmonitor:local

Si los puertos reales son diferentes, prevalecerá el resultado de la verificación de duplicación.

El front-end del contenedor no significa que todas las API estén localizadas

Abra el panel Red de las herramientas de desarrollo de su navegador. Actualiza la página y agrupa las solicitudes por nombre de dominio. Cualquier solicitud para acceder a Vercel, Railway, Upstash, noticias de terceros o interfaces de mercado indica que todavía existe una dependencia actual de la nube. No utilice “la página web proviene de su propio servidor” para deducir “los datos no salen de la LAN”. Cuando se requiera aislamiento, reemplace los puntos finales de API elemento por elemento o deshabilite los paneles que no funcionan localmente.

Proporcionando un resumen local

con Ollama La ruta LLM nativa de World Monitor admite servicios compatibles con OpenAI y puede descubrir modelos Ollama, LM Studio, llama.cpp y vLLM. Confirmar el servicio luego de instalar Ollama:

1
2
3
ollama --version
ollama list
curl http://127.0.0.1:11434/api/tags

Extraiga un modelo de comando adecuado para recursos nativos:

1
ollama pull qwen3:8b

Vuelva a probar el punto final compatible con OpenAI:

1
curl http://127.0.0.1:11434/v1/models

En la aplicación, apunte la URL base a la dirección de bucle invertido y seleccione la ID del modelo real.

La cadena alternativa de LLM local requiere verificación activa

La documentación del proyecto describe una secuencia resumida de respaldo que incluye LLM nativo, Groq, OpenRouter y el navegador T5. Si el objetivo es evitar que los datos salgan de la red, simplemente configurar Ollama no es suficiente. También elimine la clave de la nube, bloquee los nombres de dominio relacionados y confirme que el navegador no retroceda silenciosamente después de un tiempo de espera local. Detener el servicio de Ollama:

1
sudo systemctl stop ollama

Activar resumen nuevamente. Una configuración estrictamente fuera de línea debería indicar claramente que el servicio local no está disponible en lugar de generar un resumen en la nube.

PMTiles resuelve la dependencia del mapa base

Los mapas tradicionales solicitarán continuamente mosaicos en línea por ventana gráfica. PMTiles organiza mosaicos en archivos individuales que se pueden colocar en un disco local, NAS, almacenamiento de objetos o un servicio HTTP normal. Después de preparar el archivo, realice primero el servicio HTTP mínimo:

1
python3 -m http.server 9000 --directory /srv/pmtiles

Acceda al archivo PMTiles desde su navegador y confirme que las solicitudes de rango sean compatibles. Sin compatibilidad con Range, es posible que el mapa intente descargar el archivo grande completo o no pueda ubicar el mosaico. El proxy inverso debe conservar los encabezados relacionados con Range y Accept-Ranges.

Cómo elegir entre Cloudflare R2 y almacenamiento LAN

R2 es adecuado para servicios de red pública, puede reducir el ancho de banda del sitio de origen y proporcionar acceso a nivel de objeto. LAN MinIO, NAS o nginx son más adecuados para entornos aislados. Los archivos de mapas base pueden ser grandes, tener un tamaño de registro y hash antes de publicarlos:

1
2
sha256sum world.pmtiles
du -h world.pmtiles

Después de que el cliente configure la URL, use el navegador para confirmar la solicitud y devolver 206 Partial Content.

Redis no es un umbral estricto para la prueba local

El desarrollo por parte de una sola persona no requiere la implementación de un sistema de caché completo. Los servicios de red pública o para varias personas requieren que Redis controle las tormentas de actualización, almacene en caché los resultados iniciales y limite el tráfico. Iniciar Redis local:

1
2
docker run --rm --name worldmonitor-redis \
  -p 127.0.0.1:6379:6379 redis:7-alpine

Verificación:

1
docker exec worldmonitor-redis redis-cli ping

Debe devolverse PONG. Redis no debe exponerse directamente a la red pública y no depender de la configuración sin contraseña predeterminada para el acceso entre hosts.

Cómo determinar el puesto de responsabilidad cuando falla una fuente de datos externa

Comience verificando la URL, el código de estado y el tiempo de respuesta de la solicitud del navegador. 401 o 403 suele ser una clave, una cuota o un rango de autorización. 429 indica limitación de velocidad. Agregar reintentos puede agravar el problema. 5xx necesita distinguir su propio proxy, servicio ascendente y capa de caché. Un array vacío no necesariamente es un fallo, puede ser que no haya datos para la región y rango de tiempo. Guarde el ID de la solicitud y el encabezado de la respuesta, no se limite a tomar una captura de pantalla del panel en blanco.

El AIS y la transmisión en tiempo real no pueden ser reemplazados por una construcción estática

Las capas de interferencia AIS, de vuelo y de GPS de envío dependen de flujos de datos continuos o semillas periódicas. Pure nginx SPA solo puede mostrar datos existentes y llamar a interfaces ascendentes. Cuando necesite autohospedar flujos relacionados, lea scripts/ais-relay.cjs y Configuración de implementación para confirmar los permisos del proveedor de datos. No refleje ni vuelva a publicar incondicionalmente fuentes de datos vistas en páginas web públicas.

Activar la verificación de estado y la supervisión de la actualización de los datos

La aplicación puede devolver 200, lo que no significa que se estén actualizando los datos. El monitoreo se divide en al menos tres niveles: páginas estáticas, puntos finales API y frescura de las semillas. Registre el último momento de éxito y el número de fallos consecutivos para cada fuente de datos. No se debe marcar todo el sitio como completamente saludable cuando las noticias aún se están actualizando y el mercado está a la baja.

Ejecute las comprobaciones propias del proyecto antes de construir

1
2
3
4
npm run typecheck
npm run test:data
npm run test:e2e
npm run build:full

La existencia del comando se basa en el repositorio actual package.json y make help. Cuando la prueba de datos falla, no elimine la fuente del error para que el CI se vuelva verde. Primero confirme si el formato ha cambiado. E2E requiere dependencias del navegador y datos de prueba estables, y la CI del contenedor requiere memoria compartida reservada.

El proxy inverso solo abre la entrada requerida

La implementación de la red pública utiliza HTTPS y deja el extremo de administración, Redis, Ollama y los puntos finales internos en la red privada. Ollama no debería estar expuesto directamente a Internet de forma predeterminada. Si el front-end y la API están en dominios separados, establezca explícitamente la lista de permitidos de CORS. No utilice una combinación que permita que cualquier origen también lleve credenciales.

Haz un simulacro de desconexión real

Desconectarse de Internet después de cargar un panel es propenso a generar falsos positivos porque el trabajador del servicio, la caché del navegador y IndexedDB aún contienen datos antiguos. Primero borre el perfil de prueba, bloquee los nombres de dominio externos y luego vuelva a abrir la aplicación. Registre qué paneles son normales, cuáles muestran caché antiguo y cuáles informan errores. Compruebe que la marca de tiempo identifique claramente que los datos han caducado. El modo sin conexión debería degradarse con elegancia en lugar de disfrazar la información antigua como información en tiempo real.

Preservar la variante y la configuración del mapa al actualizar

Guarde la confirmación, el nombre de la variable .env.local, la URL de PMTiles, el esquema de Redis y la configuración del proxy inverso antes de realizar la actualización.

1
2
3
git fetch --tags
git log --oneline --decorate -10
git diff -- .env.example docker/ deploy/

Primero cree el nuevo árbol de trabajo, no sobrescriba directamente el directorio en ejecución. El formato de configuración del almacenamiento local del front-end puede cambiar. Verifique la variante, capa y ciclo de actualización después de la actualización.

Lista de determinación completada por el autohospedaje

  • Se puede crear la página con la variante requerida.
  • Los puertos de imágenes de Docker surgen de una inspección, no de conjeturas.
  • Todas las claves API están fuera de Git.
  • No va silenciosamente a la nube cuando falla el LLM local.
  • PMTiles devuelve una solicitud de rango.
  • Redis, Ollama y los servicios internos no están expuestos a la red pública.
  • Cada fuente de datos en tiempo real tiene una última hora de actualización.
  • La prueba fuera de línea puede distinguir entre caché y disponibilidad real.
  • Licencia comprobada para uso comercial.

Los límites del autohospedaje de World Monitor dependen de cuántas fuentes de datos en vivo conserve. Primero, dibujar claramente las dependencias de la red y luego decidir si usar una interfaz local, un resumen de privacidad o un aislamiento completo es más confiable que seguir directamente “un comando de Docker”.

Información del proyecto