[{"data":1,"prerenderedAt":190},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-grist-en-un-vps-alternativa-a-airtable-ma-es":6,"promo-bar-likely":157},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-grist-en-un-vps-alternativa-a-airtable-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":125,"ctaBody":126,"ctaButton":127,"ctaUrl":128,"relatedPosts":129},218,"alojar-grist-en-un-vps-alternativa-a-airtable",{"fr":12,"en":13,"ar":14,"es":10},"self-host-grist-vps","self-hosting-grist-on-a-vps-open-source-airtable-alternative","استضافة-grist-على-vps-بديل-airtable-مفتوح-المصدر","Alojar Grist en VPS: hoja de cálculo-base de datos open-source","Despliegue Grist v1.7.20 en un VPS: Docker Compose, nginx HTTPS, fórmulas Python, SSO OIDC, copias automáticas — alternativa open-source a Airtable.",7,3,false,"2026-08-04T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[28],{"id":17,"name":23,"slug":24,"color":25,"icon":26},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-grist-vps-poster.svg",{"categorySlug":33,"appSlug":34},"desarrollo","grist","Google Sheets almacena listas. Airtable añade relaciones entre tablas, pero cobra 20 $ por usuario al mes. Grist hace las dos cosas, en open-source, en su propio servidor: columnas tipadas, referencias entre tablas, fórmulas Python que se ejecutan en el servidor y una API REST generada automáticamente en cada documento. Resultado: una herramienta completa de modelado de datos, sin suscripción y sin vendor lock-in.",[37,41,50,53,66,69,72,75,78,122],{"type":38,"title":39,"body":40},"h2","Por qué Grist en lugar de Google Sheets o Airtable","Google Sheets es una hoja de cálculo: almacena datos planos, los cálculos se limitan a funciones de hoja y las relaciones entre hojas se apoyan en VLOOKUP frágiles. Airtable resuelve eso con bases relacionales, pero a 20 $ por usuario al mes la cuenta sube rápido para una agencia o un equipo técnico.\n\nGrist combina ambos mundos: una interfaz de hoja de cálculo familiar sobre una base de datos relacional real. Cada documento contiene tablas con columnas tipadas (texto, numérico, fecha, referencia, adjunto), relaciones explícitas entre tablas mediante columnas de referencia y fórmulas Python que se ejecutan en el servidor, no en el navegador. En su VPS, Grist cuesta 0 $ al mes adicionales.",{"type":42,"title":43,"items":44},"ul","Lo que Grist hace y Google Sheets no",[45,46,47,48,49],"**Relaciones entre tablas**: una columna de referencia en `Pedidos` apunta a `Clientes` — no un VLOOKUP que se rompe, sino una clave foránea real con autocompletado.","**Fórmulas Python del lado del servidor**: `import datetime`, `import re`, `import uuid` — y cualquier librería Python pura. Las fórmulas se ejecutan en un sandbox del servidor, no en el navegador.","**API REST automática**: cada documento expone `\u002Fapi\u002Fdocs\u002F\u003Cid>\u002Ftables\u002F\u003Ctable>\u002Frecords` sin configuración. Integre Grist en n8n, Make o cualquier cliente HTTP.","**Múltiples vistas sobre los mismos datos**: grid, tarjeta, gráfico, calendario, widget personalizado — cada vista se filtra y se configura de forma independiente sin duplicar los datos.","**Reglas de acceso por fila y por columna**: limite la lectura o la escritura de una fila según el atributo del usuario — lo bastante fino para documentos multi-tenant.",{"type":38,"title":51,"body":52},"Requisitos y arquitectura Docker","Un VPS con **al menos 1 GB de RAM** y Docker instalado es suficiente para empezar. Grist se despliega en un solo contenedor `gristlabs\u002Fgrist` que incorpora Node.js (servidor web), Python (sandbox de fórmulas) y SQLite (almacenamiento de documentos). Un volumen con nombre `\u002Fpersist` guarda los archivos `.grist` — un archivo por documento. No se requiere ningún servicio externo.\n\nEl puerto por defecto es **8484**. Verifique que es accesible desde localhost antes de configurar el reverse proxy (`curl -sI http:\u002F\u002Flocalhost:8484\u002F`).",{"type":54,"title":55,"steps":56},"steps","Docker Compose completo y despliegue",[57,60,63],{"title":58,"body":59},"Crear el directorio y docker-compose.yml","Conéctese por SSH a su VPS y cree el directorio de stack:\n\n```bash\nmkdir -p \u002Fopt\u002Fstacks\u002Fgrist && cd \u002Fopt\u002Fstacks\u002Fgrist\n```\n\nCree el siguiente `docker-compose.yml`:\n\n```yaml\nservices:\n  grist:\n    image: gristlabs\u002Fgrist:1.7.20\n    container_name: grist\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8484:8484\"\n    volumes:\n      - grist_data:\u002Fpersist\n    environment:\n      GRIST_SESSION_SECRET: \"REEMPLACE_CON_openssl_rand_hex_32\"\n      APP_HOME_URL: \"https:\u002F\u002Fgrist.sudominio.com\"\n      GRIST_DEFAULT_EMAIL: \"admin@localhost.local\"\n      GRIST_SANDBOX_FLAVOR: \"gvisor\"\n\nvolumes:\n  grist_data:\n```\n\nGenere el secreto de sesión antes de iniciar: `openssl rand -hex 32`. No reutilice este valor en otras instancias.",{"title":61,"body":62},"Arrancar y verificar","```bash\ndocker compose up -d\ndocker compose logs -f grist\n```\n\nEspere el mensaje `Grist server ready`. Compruebe el estado HTTP:\n\n```bash\ncurl -sI http:\u002F\u002Flocalhost:8484\u002F\n```\n\nDebe obtener `HTTP\u002F1.1 200 OK` o una redirección `302`. Si el contenedor sigue reiniciándose, consulte la sección de Resolución de problemas.",{"title":64,"body":65},"Configurar nginx como reverse proxy HTTPS","Instale nginx y certbot en el VPS, luego cree `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fgrist.conf`:\n\n```nginx\nserver {\n    listen 80;\n    server_name grist.sudominio.com;\n    return 301 https:\u002F\u002F$host$request_uri;\n}\n\nserver {\n    listen 443 ssl;\n    server_name grist.sudominio.com;\n\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgrist.sudominio.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgrist.sudominio.com\u002Fprivkey.pem;\n    ssl_protocols TLSv1.2 TLSv1.3;\n\n    add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains\" always;\n    add_header X-Frame-Options SAMEORIGIN always;\n    add_header X-Content-Type-Options nosniff always;\n    add_header Referrer-Policy strict-origin-when-cross-origin always;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:8484;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_read_timeout 300s;\n    }\n}\n```\n\nObtenga el certificado y active el vhost:\n\n```bash\ncertbot certonly --nginx -d grist.sudominio.com\nln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fgrist.conf \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\nnginx -t && systemctl reload nginx\n```\n\nActualice `APP_HOME_URL` en el Compose y reinicie: `docker compose up -d`.",{"type":38,"title":67,"body":68},"Fórmulas Grist avanzadas: VLOOKUP y referencias cruzadas entre tablas","Grist reemplaza los VLOOKUP frágiles de Google Sheets con **columnas de referencia** y **funciones de búsqueda tipadas**. En una tabla `Pedidos` con una columna `Cliente` de tipo `Reference → Clientes`, acceder al nombre del cliente es simplemente `$Cliente.Nombre` — sin VLOOKUP.\n\nPara agregaciones, Grist proporciona `lookupRecords()` y `lookupOne()`:\n\n```python\n# En la tabla Clientes — importe total de pedidos de un cliente\nSUM(Pedidos.lookupRecords(Cliente=$id).Importe)\n\n# En la tabla Pedidos — obtener el código postal del cliente\nClientes.lookupOne(Nombre=$Cliente.Nombre).CodigoPostal\n\n# Cálculo de descuento progresivo con Python estándar\nimport datetime\nretraso = (datetime.date.today() - $FechaPedido).days\n$Importe * (1 - 0.02 * retraso \u002F\u002F 30)\n```\n\nLas fórmulas Python se ejecutan en un **sandbox gVisor** (`GRIST_SANDBOX_FLAVOR=gvisor`): el proceso Python no tiene acceso al sistema de archivos ni a la red.",{"type":38,"title":70,"body":71},"Autenticación SSO con OIDC (opcional)","Para despliegues multiusuario con autenticación real, Grist soporta **OpenID Connect (OIDC)** con Authentik, Keycloak, Google Workspace o cualquier proveedor compatible.\n\nAñada estas variables al Compose:\n\n```yaml\nenvironment:\n  GRIST_OIDC_IDP_ISSUER: \"https:\u002F\u002Fauth.sudominio.com\u002Fapplication\u002Fo\u002Fgrist\u002F\"\n  GRIST_OIDC_IDP_CLIENT_ID: \"su-client-id\"\n  GRIST_OIDC_IDP_CLIENT_SECRET: \"su-client-secret\"\n  GRIST_OIDC_IDP_SCOPES: \"openid email profile\"\n  GRIST_OIDC_SP_HOST: \"https:\u002F\u002Fgrist.sudominio.com\"\n```\n\nEliminar `GRIST_DEFAULT_EMAIL` una vez configurado OIDC — las dos variables son incompatibles. El primer usuario que inicie sesión mediante OIDC se convierte en administrador del sitio.",{"type":38,"title":73,"body":74},"Copias de seguridad: volúmenes Docker y exportación","Los documentos Grist residen en el volumen Docker `grist_data`, bajo `\u002Fpersist\u002Fdocs\u002F`. Dos estrategias complementarias:\n\n**Snapshot del volumen** (copia completa, recomendado): monte `\u002Fpersist\u002Fdocs\u002F` en un job de Backrest (disponible en el catálogo ServOrbit). Backrest hace snapshots de la carpeta con restic y envía los incrementos cifrados a S3, Backblaze B2 o SFTP — sin detener Grist.\n\n```bash\n# Copia de seguridad manual de emergencia\ndocker run --rm \\\n  -v grist_data:\u002Fsource:ro \\\n  -v \u002Fbackups\u002Fgrist:\u002Fdest \\\n  alpine tar czf \u002Fdest\u002Fgrist-$(date +%Y%m%d).tar.gz -C \u002Fsource .\n```\n\n**Exportación por documento**: en Grist, menú Document → Export → `.grist` (formato SQLite nativo) o CSV\u002FXLSX por tabla. Grist también conserva un **historial de snapshots por documento** (Document → History).",{"type":38,"title":76,"body":77},"Resolución de problemas frecuentes","**El contenedor sigue reiniciándose**: revise los logs (`docker compose logs grist`). La causa más frecuente es un `GRIST_SESSION_SECRET` vacío o demasiado corto — debe tener al menos 32 caracteres hexadecimales.\n\n**Errores CORS en la API**: si llama a `\u002Fapi\u002Fdocs\u002F…` desde un dominio diferente, añada `GRIST_ALLOWED_HOSTS=grist.sudominio.com` y asegúrese de que `APP_HOME_URL` coincida exactamente con la URL pública (con `https:\u002F\u002F`, sin barra final).\n\n**Lentitud en grandes conjuntos de datos**: en tablas con más de 100.000 filas, limite los `lookupRecords()` a columnas indexadas y evite fórmulas Python con importaciones pesadas en columnas de trigger.\n\n**Problemas de acceso tras cambio de dominio**: actualice `APP_HOME_URL`, borre las cookies del navegador y reinicie el contenedor.",{"type":79,"title":80,"intro":81,"headers":82,"rows":87,"conclusion":121},"comparison","Grist vs NocoDB vs Baserow: elegir su hoja de cálculo open-source","Las tres herramientas ocupan el nicho «Airtable open-source», pero con posicionamientos distintos.",[83,84,85,86],"Criterio","Grist","NocoDB","Baserow",[88,93,98,103,108,112,117],[89,90,91,92],"Almacenamiento","SQLite por documento (archivo .grist)","PostgreSQL o MySQL (BD compartida)","PostgreSQL (BD compartida)",[94,95,96,97],"Fórmulas","Python del lado del servidor (sandbox)","Sin fórmulas nativas","Fórmulas limitadas, JS en cliente",[99,100,101,102],"REST API","Automática por documento","Automática por base","Automática",[104,105,106,107],"Auth SSO","OIDC nativo","LDAP, OIDC (Enterprise)","SSO de pago",[109,110,111,111],"Copias de seguridad","Un archivo .grist por documento","Dump PostgreSQL",[113,114,115,116],"Caso de uso ideal","Modelado de datos, fórmulas complejas","Reemplazo de Airtable para equipos","Interfaz no-code para equipos de negocio",[118,119,120,120],"Recursos (inicio)","1 GB RAM, Docker","2 GB RAM, Docker + PostgreSQL","Grist es el único de los tres que aísla cada documento en un archivo SQLite autónomo — lo que simplifica la copia de seguridad y la migración de documentos individuales. NocoDB y Baserow comparten una base PostgreSQL única, lo que facilita la gestión centralizada pero complica la portabilidad de un proyecto.",{"type":123,"body":124},"tip","Para actualizar Grist, cambie la etiqueta de imagen en el Compose (`gristlabs\u002Fgrist:1.7.20` → siguiente versión), detenga el contenedor (`docker compose down`) y reinícielo (`docker compose up -d`). El volumen `grist_data` persiste entre versiones. Consulte las notas de versión en github.com\u002Fgristlabs\u002Fgrist-core antes de cada actualización — algunas versiones introducen migraciones de esquema irreversibles.","Su Airtable, en su propio servidor","Despliegue Grist en un VPS ServOrbit y modele sus datos sin suscripción y sin vendor lock-in — API REST, fórmulas Python, colaboración en tiempo real.","Desplegar Grist","\u002Fapplications\u002Fdesarrollo\u002Fgrist",[130,148,167],{"id":131,"slug":132,"slugs":133,"title":137,"excerpt":138,"readTime":139,"views":140,"isPinned":19,"noindex":19,"publishedAt":141,"updatedAt":21,"category":142,"categories":143,"featuredImage":29,"bgImage":30,"posterImage":145,"relatedSolution":146},188,"alojar-nocobase-en-un-vps-no-code-herramientas-internas",{"fr":134,"en":135,"ar":136,"es":132},"self-host-nocobase-vps","self-host-nocobase-on-a-vps-no-code-platform-for-internal-tools","استضافة-nocobase-على-vps-منصة-بلا-كود-لأدواتك-الداخلية","Alojar NocoBase en un VPS: no-code para herramientas internas","Despliegue NocoBase en su VPS — la plataforma no-code\u002Flow-code para crear herramientas internas, CRM y workflows. Apache-2.0, 23 k+ estrellas, v2.1.26.",10,1,"2026-07-22T00:00:00+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},[144],{"id":17,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fself-host-nocobase-vps-poster.svg",{"categorySlug":33,"appSlug":147},"nocobase",{"id":149,"slug":150,"slugs":151,"title":155,"excerpt":156,"readTime":18,"views":140,"isPinned":19,"noindex":157,"publishedAt":158,"updatedAt":159,"category":160,"categories":161,"featuredImage":29,"bgImage":30,"posterImage":163,"relatedSolution":164},157,"como-autoalojar-nocodb-en-un-vps",{"fr":152,"en":153,"ar":154,"es":150},"self-host-nocodb-vps","how-to-self-host-nocodb-on-a-vps","كيفية-استضافة-nocodb-ذاتيا-على-خادم-vps","Cómo autoalojar NocoDB en un VPS","Despliegue NocoDB en su VPS: la alternativa open source y autoalojada a Airtable. Convierta su base de datos en una hoja de cálculo con API REST y GraphQL.",true,"2026-01-20T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},[162],{"id":17,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fself-host-nocodb-vps-poster.svg",{"categorySlug":165,"appSlug":166},"bases-de-datos","nocodb",{"id":168,"slug":169,"slugs":170,"title":174,"excerpt":175,"readTime":176,"views":18,"isPinned":19,"noindex":19,"publishedAt":177,"updatedAt":178,"category":179,"categories":185,"featuredImage":29,"bgImage":30,"posterImage":187,"relatedSolution":188},67,"alojar-meilisearch-en-un-vps",{"fr":171,"en":172,"ar":173,"es":169},"heberger-meilisearch-vps","hosting-meilisearch-on-a-vps","استضافة-meilisearch-على-خادم-vps","Alojar Meilisearch en un VPS","Aloje Meilisearch en su VPS: motor de búsqueda instantáneo y tolerante a las erratas. Guía de Docker, master key y SSL.",5,"2026-04-14T00:00:00+00:00","2026-09-08T22:00:01+00:00",{"id":180,"name":181,"slug":182,"color":183,"icon":184},6,"Bases de datos","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[186],{"id":180,"name":181,"slug":182,"color":183,"icon":184},"\u002Fblog\u002Fcovers\u002Fheberger-meilisearch-vps-poster.svg",{"categorySlug":165,"appSlug":189},"meilisearch",1794270525670]