[{"data":1,"prerenderedAt":195},["ShallowReactive",2],{"seo-verification":3,"blog-autoalojar-marimo-vps-notebooks-python-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-autoalojar-marimo-vps-notebooks-python-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":131,"ctaBody":132,"ctaButton":133,"ctaUrl":134,"relatedPosts":135},552,"autoalojar-marimo-vps-notebooks-python",{"fr":12,"en":13,"ar":14,"es":10},"self-host-marimo-vps","self-host-marimo-vps-python-notebooks","استضافة-marimo-على-vps-دفاتر-python","marimo en un VPS: notebooks de Python reactivos self-hosted","Instala marimo en un VPS: notebooks de Python reactivos guardados como archivos .py, editor web protegido con contraseña, pandas y polars incluidos.",8,0,false,"2026-11-01T00:00:00+00:00","2026-11-01T14:14:31+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-marimo-vps-poster.svg",{"categorySlug":34,"appSlug":35},"desarrollo","marimo","Un notebook de Jupyter que ha estado abierto toda la tarde suele acabar mintiendo: una celda modificada, otra que nunca se volvió a ejecutar, y el gráfico en pantalla ya no corresponde al código. marimo resuelve este problema de raíz. Este notebook de Python de código abierto (licencia Apache-2.0) guarda cada notebook en un simple archivo .py y vuelve a ejecutar automáticamente las celdas que dependen de la que modificas. Esta guía lo instala con Docker Compose en un VPS, protege el editor con una contraseña, lo publica por HTTPS detrás de nginx y muestra cómo convertir un notebook en una pequeña aplicación.",[38,42,52,84,87,103,107,110,113,116,119,122,125,128],{"type":39,"title":40,"body":41},"h2","Por qué un notebook reactivo en tu propio servidor","En Jupyter, el orden de ejecución depende de tus clics: una variable redefinida más abajo, una celda olvidada, y los resultados mostrados ya no corresponden al código. El archivo .ipynb, un JSON cargado de salidas, se revisa mal y genera conflictos en Git en cada ejecución.\n\nmarimo analiza las dependencias entre celdas. Cuando una celda cambia, se recalculan todas las que dependen de ella, y solo esas. El notebook es un archivo de Python normal: `git diff` lo lee y `python notebook.py` lo ejecuta.\n\nAlojarlo en tu VPS significa mantener los datos en un servidor que controlas, dar a todo el equipo el mismo entorno desde el navegador y elegir la memoria y el procesador que necesitan tus cálculos.",{"type":43,"title":44,"items":45},"ul","Lo que aporta marimo",[46,47,48,49,50,51],"**Ejecución reactiva** — una celda modificada recalcula las que dependen de ella, sin estado oculto.","**Archivos .py** — notebooks legibles, versionables en Git y ejecutables como scripts.","**Elementos de interfaz** — deslizadores, menús, tablas y gráficos ligados a variables de Python.","**Del notebook a la aplicación** — `marimo run` sirve un notebook en solo lectura, con el código oculto.","**Migración desde Jupyter** — `marimo convert` transforma un archivo .ipynb.","**Imagen oficial «data»** — pandas, polars, numpy y altair preinstalados.",{"type":53,"title":54,"headers":55,"rows":58},"comparison","marimo, Jupyter y code-server",[5,35,56,57],"JupyterLab","code-server",[59,64,69,74,79],[60,61,62,63],"Formato del notebook","Archivo .py","Archivo .ipynb (JSON)","Archivos del proyecto",[65,66,67,68],"Orden de ejecución","Reactivo, por dependencias","Manual, con cada clic","Según el script que lances",[70,71,72,73],"Revisión en Git","Diff de Python legible","Diff de JSON con salidas","Diff del código",[75,76,77,78],"Publicar como aplicación","Sí, `marimo run`","Extensiones de terceros","No",[80,81,82,83],"Uso ideal","Análisis y herramientas internas en Python","Gran variedad de kernels","Desarrollo de software completo",{"type":39,"title":85,"body":86},"Requisitos previos","Un VPS Ubuntu 24.04 con 2 GB de RAM y 20 GB de disco (prevé más memoria si cargas conjuntos de datos grandes), Docker y el plugin Compose instalados, y acceso root por SSH. Un subdominio (por ejemplo notebooks.example.com) que apunte al VPS es útil para el acceso HTTPS, pero no imprescindible: un túnel SSH basta si trabajas solo.",{"type":88,"title":89,"steps":90},"steps","Instalar marimo con Docker Compose",[91,94,97,100],{"title":92,"body":93},"Preparar el directorio y la contraseña","Crea el directorio de la aplicación y un archivo `.env` con la contraseña del editor.\n```bash\nmkdir -p \u002Fopt\u002Fmarimo && cd \u002Fopt\u002Fmarimo\necho \"ADMIN_PASSWORD=$(openssl rand -base64 24 | tr -d '\u002F+=')\" > .env\nchmod 600 .env\n```",{"title":95,"body":96},"Escribir el archivo compose","Crea `compose.yaml`. La imagen oficial «data» ya contiene las librerías de análisis. El puerto solo se publica en la interfaz de loopback y la contraseña se transmite mediante un archivo en lugar de la línea de comandos.\n```yaml\nservices:\n  marimo:\n    image: ghcr.io\u002Fmarimo-team\u002Fmarimo:0.25.2-data\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:2718:8080\"\n    environment:\n      ADMIN_PASSWORD: ${ADMIN_PASSWORD:?ADMIN_PASSWORD requis}\n    command:\n      - sh\n      - -c\n      - umask 077 && printf %s \"$$ADMIN_PASSWORD\" > \u002Ftmp\u002Fmarimo-password && exec marimo edit --headless --skip-update-check --host 0.0.0.0 -p 8080 --token-password-file \u002Ftmp\u002Fmarimo-password \u002Fapp\n    volumes:\n      - marimo-data:\u002Fapp\nvolumes:\n  marimo-data: {}\n```",{"title":98,"body":99},"Arrancar y comprobar","Inicia la pila y consulta la sonda de salud: debe responder 200.\n```bash\ndocker compose up -d\ndocker compose ps\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' http:\u002F\u002F127.0.0.1:2718\u002Fhealth\n```",{"title":101,"body":102},"Publicar el editor por HTTPS","marimo se comunica con el navegador por WebSocket: el vhost de nginx debe transmitir las cabeceras `Upgrade` y `Connection`; si no, el editor se muestra pero las celdas nunca se ejecutan.\n```nginx\nserver {\n    server_name notebooks.example.com;\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:2718;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n        proxy_read_timeout 3600s;\n    }\n}\n```\n\n```bash\ncertbot --nginx -d notebooks.example.com\n```",{"type":104,"title":105,"body":106},"tip","¿Sin dominio? Usa un túnel SSH","El editor ejecuta código Python con los permisos del contenedor: nunca lo expongas sin contraseña. Si trabajas solo, no hace falta publicarlo — un túnel SSH abre el editor en http:\u002F\u002Flocalhost:2718 desde tu equipo.\n```bash\nssh -L 2718:127.0.0.1:2718 root@\u003Cvps-ip>\n```",{"type":39,"title":108,"body":109},"Proteger el editor","Un editor de marimo abierto permite a quien entre ejecutar Python en tu servidor: esa es su razón de ser, y por eso se imponen algunas reglas sencillas.\n\n**Una contraseña larga y única.** La del archivo `.env` es aleatoria; no la sustituyas por una contraseña que uses en otro sitio, y cámbiala cuando un colaborador que la conoce deje el proyecto (edita `.env` y luego `docker compose up -d`).\n\n**Un puerto que se queda en local.** El compose publica el puerto solo en `127.0.0.1`: desde Internet, únicamente nginx por HTTPS llega a él. Nunca cambies esa dirección por `0.0.0.0`.\n\n**Nada de secretos en claro en los notebooks.** Un notebook es un archivo Python versionado: una clave de API escrita en una celda acaba en el historial de Git. Léela desde una variable de entorno añadida al compose, o desde un archivo fuera del repositorio.\n\n**Registros que vigilar.** Al arrancar, marimo muestra su dirección de acceso en `docker compose logs`, contraseña incluida: el registro se queda en tu VPS, pero no lo pegues tal cual en un ticket o en un chat.",{"type":39,"title":111,"body":112},"Tu primer notebook reactivo","Inicia sesión con la contraseña del archivo `.env`. El editor abre la carpeta `\u002Fapp`, que ya contiene los tutoriales oficiales. Crea un notebook con dos celdas: la primera define un deslizador y la segunda filtra un archivo CSV con su valor. Mueve el deslizador: la segunda celda se recalcula sola.\n\n```python\nimport marimo as mo\nimport polars as pl\n\numbral = mo.ui.slider(0, 1000, value=100, label=\"Importe mínimo\")\numbral\n```\n\n```python\nventas = pl.read_csv(\"data\u002Fventas.csv\")\nventas.filter(pl.col(\"importe\") >= umbral.value)\n```",{"type":39,"title":114,"body":115},"Leer tus datos: CSV, Parquet y API","La imagen «data» cubre lo esencial de un análisis sin instalar nada. pandas lee archivos CSV, Excel y JSON; polars lee CSV y Parquet muy rápido y puede procesar archivos más grandes que la memoria en modo perezoso; altair dibuja gráficos interactivos que se muestran justo debajo de la celda.\n\nDeja tus archivos en la carpeta `\u002Fapp\u002Fdata` del volumen, con `scp` hacia el VPS y luego `docker compose cp`, o súbelos desde el panel de archivos del editor. Para una API, la biblioteca estándar de Python basta para descargar un JSON, que pandas o polars convierten después en una tabla.\n\nCada resultado de celda es un objeto vivo: un DataFrame se muestra como una tabla ordenable y filtrable, y la selección hecha en una tabla o un gráfico puede alimentar la celda siguiente. Ese mecanismo es el que convierte una exploración en una herramienta reutilizable.",{"type":39,"title":117,"body":118},"Convertir un notebook en aplicación","Un notebook con elementos de interfaz ya es una aplicación. `marimo run` lo sirve en solo lectura: los visitantes usan los deslizadores y los menús sin ver ni modificar el código. Publica este segundo puerto detrás de su propio vhost, protegido como el editor.\n\n```bash\ndocker compose exec marimo marimo run \u002Fapp\u002Frapport.py --host 0.0.0.0 -p 8081\n```\n\nTus notebooks de Jupyter existentes se convierten con un solo comando; después revisa las celdas que redefinían una misma variable, algo que marimo rechaza por diseño.\n\n```bash\ndocker compose exec marimo marimo convert \u002Fapp\u002Fold.ipynb -o \u002Fapp\u002Fnew.py\n```",{"type":39,"title":120,"body":121},"Trabajar en equipo sobre los mismos notebooks","Un servidor de marimo es un editor compartido: todas las personas con la contraseña ven los mismos archivos. Para un equipo pequeño, la regla más sencilla es un notebook por persona y por tema, y un repositorio Git en `\u002Fapp` para conservar el historial.\n\nComo cada notebook es un archivo .py, se aplican las herramientas habituales del desarrollador: `git diff` muestra exactamente qué celda cambió, una solicitud de fusión se revisa como código, y un linter o formateador de Python se ejecuta sobre él sin adaptación. Un notebook puede incluso importarse como módulo o ejecutarse como script desde una tarea programada, para producir cada noche el mismo informe.",{"type":39,"title":123,"body":124},"Dimensionar el VPS","marimo en sí es ligero; son tus datos los que fijan el tamaño del servidor. Cuenta con 2 GB de RAM para explorar archivos de unos cientos de megabytes con pandas, y sube a 4 u 8 GB si cargas conjuntos de datos más voluminosos o si varias personas trabajan a la vez. El procesador importa sobre todo para cálculos pesados: polars aprovecha todos los núcleos disponibles. Prevé por último disco suficiente para la imagen (unos 400 MB) y para tus archivos de datos, que crecen más rápido que los notebooks.",{"type":39,"title":126,"body":127},"Copia de seguridad y actualización","Los notebooks viven en el volumen `marimo-data`. Lo más seguro es versionar `\u002Fapp` en un repositorio Git; si no, archiva el volumen con regularidad.\n\n```bash\ndocker run --rm -v marimo_marimo-data:\u002Fdata -v \"$PWD\":\u002Fbackup alpine \\\n  tar czf \u002Fbackup\u002Fmarimo-$(date +%F).tar.gz -C \u002Fdata .\n```\n\nPara actualizar, cambia la etiqueta de la imagen en `compose.yaml` tras leer las notas de versión del proyecto y ejecuta `docker compose pull && docker compose up -d`. Los notebooks, simples archivos .py, no se tocan.",{"type":39,"title":129,"body":130},"Instalación en un clic desde el Marketplace de ServOrbit","En un VPS de ServOrbit, marimo se instala desde el Marketplace de tu área de cliente: el script despliega el contenedor oficial, genera la contraseña del editor y crea el volumen de los notebooks. La contraseña aparece en tu área de cliente. Asocia un subdominio de uno de tus dominios, o el subdominio gratuito del VPS, para abrir el editor por HTTPS; sin dominio, el túnel SSH descrito más arriba funciona tal cual, con el puerto que aparece en tu área de cliente.","Tus notebooks de Python, en tu VPS","Un VPS Ubuntu 24.04 de ServOrbit con 2 GB de RAM basta para marimo. Instalación en un clic desde el Marketplace, contraseña generada para ti, HTTPS en tu dominio o en el subdominio gratuito del VPS.","Descubrir marimo","\u002Fmarketplace\u002Fdesarrollo\u002Fmarimo",[136,158,177],{"id":137,"slug":138,"slugs":139,"title":143,"excerpt":144,"readTime":145,"views":23,"isPinned":19,"publishedAt":146,"updatedAt":147,"category":148,"categories":154,"featuredImage":30,"bgImage":31,"posterImage":156,"relatedSolution":157},301,"instalar-code-server-vps",{"fr":140,"en":141,"ar":142,"es":138},"installer-code-server-vps","install-code-server-vps","تثبيت-code-server-vps","Code Server: VS Code en su navegador sobre un VPS","Code Server (MIT, 79 k estrellas): despliegue VS Code en el navegador de su VPS, espacio persistente, sin configurar ningún IDE local.",3,"2026-08-24T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":149,"name":150,"slug":151,"color":152,"icon":153},4,"Desarrollo","developpement","bg-warning\u002F10 text-warning","dev",[155],{"id":149,"name":150,"slug":151,"color":152,"icon":153},"\u002Fblog\u002Fcovers\u002Finstaller-code-server-vps-poster.svg",{"categorySlug":34,"appSlug":57},{"id":159,"slug":160,"slugs":161,"title":165,"excerpt":166,"readTime":167,"views":149,"isPinned":19,"publishedAt":168,"updatedAt":169,"category":170,"categories":171,"featuredImage":30,"bgImage":31,"posterImage":173,"relatedSolution":174},168,"alojar-metabase-en-un-vps",{"fr":162,"en":163,"ar":164,"es":160},"self-host-metabase-vps","how-to-self-host-metabase-on-a-vps-open-source-bi-dashboards","استضافة-metabase-على-vps-لوحات-ذكاء-أعمال-مفتوحة-المصدر","Alojar Metabase en un VPS: paneles de BI open source","Despliegue Metabase en su VPS: conecte cualquier base SQL y construya paneles y gráficos en el navegador, con un Postgres complementario.",9,"2026-07-06T00:00:00+00:00","2026-10-20T23:18:08+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[172],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-metabase-vps-poster.svg",{"categorySlug":175,"appSlug":176},"bases-de-datos","metabase",{"id":178,"slug":179,"slugs":180,"title":184,"excerpt":185,"readTime":186,"views":149,"isPinned":19,"publishedAt":187,"updatedAt":188,"category":189,"categories":190,"featuredImage":30,"bgImage":31,"posterImage":192,"relatedSolution":193},45,"desplegar-una-aplicacion-fastapi-en-un-vps",{"fr":181,"en":182,"ar":183,"es":179},"deployer-fastapi-vps","deploy-a-fastapi-application-on-a-vps","نشر-تطبيق-fastapi-على-vps","Desplegar FastAPI en un VPS: guía completa de producción","Despliegue FastAPI en un VPS con Docker multistage, Gunicorn, PostgreSQL, CI\u002FCD con GitHub Actions y monitoreo. Guía completa Python producción 2025.",10,"2026-05-06T00:00:00+00:00","2026-10-07T23:07:24+00:00",{"id":149,"name":150,"slug":151,"color":152,"icon":153},[191],{"id":149,"name":150,"slug":151,"color":152,"icon":153},"\u002Fblog\u002Fcovers\u002Fdeployer-fastapi-vps-poster.svg",{"categorySlug":34,"appSlug":194},"fastapi",1793543060838]