[{"data":1,"prerenderedAt":193},["ShallowReactive",2],{"seo-verification":3,"blog-autoalojar-questdb-vps-base-series-temporales-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-autoalojar-questdb-vps-base-series-temporales-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":20,"publishedAt":21,"updatedAt":22,"category":23,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":130,"ctaBody":131,"ctaButton":132,"ctaUrl":133,"relatedPosts":134},568,"autoalojar-questdb-vps-base-series-temporales",{"fr":12,"en":13,"ar":14,"es":10},"self-host-questdb-vps","self-host-questdb-vps-time-series-database","استضافة-questdb-على-vps-قاعدة-سلاسل-زمنية","QuestDB en un VPS: base de datos de series temporales en SQL","Instala QuestDB en un VPS: una base de series temporales de código abierto con ingesta rápida y consultas SQL, consola web y API REST.",7,0,false,true,"2026-11-06T00:00:00+00:00","2026-11-08T01:13:02+00:00",{"id":17,"name":24,"slug":25,"color":26,"icon":27},"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":17,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-questdb-vps-poster.svg",{"categorySlug":34,"appSlug":35},"bases-de-datos","questdb","Las mediciones con marca de tiempo llegan de todas partes: sensores, tiempos de respuesta de una API, cotizaciones, eventos de una aplicación. Guardarlas en una base relacional clásica funciona al principio; luego las tablas crecen y los agregados por hora se vuelven lentos. QuestDB es una base de datos de series temporales de código abierto (licencia Apache-2.0) pensada para este caso: recibe los datos de forma continua y los deja consultables al instante en SQL. Esta guía la instala en un VPS con Docker Compose, la protege con contraseña, le envía datos desde curl y Python y repasa las consultas, la importación CSV, la retención y la copia de seguridad.",[38,42,52,83,86,102,106,109,112,115,118,121,124,127],{"type":39,"title":40,"body":41},"h2","Por qué una base de series temporales","Una serie temporal es una sucesión de valores fechados: la temperatura de una sonda cada diez segundos, el número de pedidos por minuto. Se escribe mucho, se modifica poco y casi siempre se consulta por intervalo de tiempo.\n\nQuestDB está construida en torno a ese uso. Cada tabla tiene una columna de tiempo designada y se divide en particiones (por día o por hora), lo que mantiene rápidas las consultas sobre un periodo y hace inmediata la eliminación de los datos antiguos. Su SQL sigue siendo SQL, con algunas palabras clave propias del tiempo.",{"type":43,"title":44,"items":45},"ul","Lo que aporta QuestDB",[46,47,48,49,50,51],"**SQL de series temporales** — `SAMPLE BY`, `LATEST ON` y `ASOF JOIN` además del SQL estándar.","**Ingesta continua** — InfluxDB Line Protocol sobre HTTP, con clientes oficiales para Python, Go, Java, Node.js, Rust y .NET.","**Consola web** — editor SQL, importación CSV arrastrando el archivo, gráficos de los resultados.","**API REST** — consultas, importación y exportación CSV por HTTP.","**Protocolo PostgreSQL** — tus controladores y herramientas PostgreSQL de siempre.","**Particiones de tiempo** — consultas rápidas sobre un periodo y borrado de datos antiguos en un comando.",{"type":53,"title":54,"headers":55,"rows":58},"comparison","QuestDB frente a una tabla PostgreSQL clásica",[5,56,57],"QuestDB","Solo PostgreSQL",[59,63,67,71,75,79],[60,61,62],"Pensada para","Mediciones continuas con marca de tiempo","Datos relacionales generales",[64,65,66],"Agregar por intervalo","SAMPLE BY 1h","date_trunc y GROUP BY",[68,69,70],"Último valor por serie","LATEST ON","Subconsulta o DISTINCT ON",[72,73,74],"Alinear dos flujos en el tiempo","ASOF JOIN","Join lateral que escribir",[76,77,78],"Borrar el historial antiguo","DROP PARTITION","DELETE y después VACUUM",[80,81,82],"Ingesta","Line Protocol, CSV, SQL","SQL y COPY",{"type":39,"title":84,"body":85},"Requisitos previos","Un VPS Ubuntu 24.04 con al menos 2 GB de RAM y 20 GB de disco, Docker y el plugin Compose instalados, y un nombre (subdominio) que apunte al VPS para el HTTPS. QuestDB funciona sobre la JVM: prevé 4 GB de RAM si ingieres muchos datos o lanzas consultas pesadas.",{"type":87,"title":88,"steps":89},"steps","Instalar QuestDB con Docker Compose",[90,93,96,99],{"title":91,"body":92},"Preparar el directorio y la contraseña","Crea el directorio de la aplicación y un archivo `.env` con la contraseña del usuario `admin`.\n```bash\nmkdir -p \u002Fopt\u002Fquestdb && cd \u002Fopt\u002Fquestdb\necho \"ADMIN_PASSWORD=$(openssl rand -hex 16)\" > .env\nchmod 600 .env\n```",{"title":94,"body":95},"Escribir el docker-compose.yml","Los puertos solo se publican en la interfaz de loopback: solo nginx llega a la consola y a la API. `QDB_HTTP_USER` y `QDB_HTTP_PASSWORD` protegen toda la API HTTP, `QDB_PG_PASSWORD` sustituye la contraseña de fábrica del protocolo PostgreSQL. La ingesta por TCP, sin autenticación en la edición de código abierto, queda desactivada, y `QDB_TELEMETRY_ENABLED` desactiva la telemetría anónima.\n```yaml\nservices:\n  questdb:\n    image: questdb\u002Fquestdb:10.1.0\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:9000:9000\"\n      - \"127.0.0.1:8812:8812\"\n    environment:\n      QDB_HTTP_USER: \"admin\"\n      QDB_HTTP_PASSWORD: \"${ADMIN_PASSWORD}\"\n      QDB_PG_USER: \"admin\"\n      QDB_PG_PASSWORD: \"${ADMIN_PASSWORD}\"\n      QDB_LINE_TCP_ENABLED: \"false\"\n      QDB_HTTP_SETTINGS_READONLY: \"true\"\n      QDB_TELEMETRY_ENABLED: \"false\"\n    volumes:\n      - questdb-data:\u002Fvar\u002Flib\u002Fquestdb\n\nvolumes:\n  questdb-data: {}\n```",{"title":97,"body":98},"Arrancar y comprobar","El arranque tarda unos segundos. Sin credenciales la API responde 401; con ellas devuelve la versión instalada.\n```bash\ndocker compose up -d\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' 'http:\u002F\u002F127.0.0.1:9000\u002Fexec?query=SELECT%201'\ncurl -u admin:VOTRE_MOT_DE_PASSE 'http:\u002F\u002F127.0.0.1:9000\u002Fexec?query=SELECT%20build()'\n```",{"title":100,"body":101},"Publicar en HTTPS con nginx","En el vhost de tu dominio (certificado obtenido con certbot), redirige al puerto local. Aumenta `client_max_body_size` para las importaciones CSV.\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:9000;\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    client_max_body_size 256m;\n}\n```",{"type":103,"title":104,"body":105},"tip","Sin QDB_HTTP_USER, la API queda abierta a todos","Sin usuario declarado, QuestDB acepta cualquier petición HTTP: quien conozca la dirección puede leer tus datos **y** crear, modificar o borrar tablas en SQL. Mantén la autenticación activa, cambia la contraseña de fábrica del protocolo PostgreSQL y no publiques nunca los puertos 9000, 8812 o 9009 directamente en la IP pública: pasa siempre por el proxy inverso HTTPS.",{"type":39,"title":107,"body":108},"Enviar datos","Lo más sencillo es el InfluxDB Line Protocol sobre HTTP: una línea por medición, con el nombre de la tabla, etiquetas y valores. La tabla y sus columnas se crean con la primera escritura.\n```bash\ncurl -u admin:VOTRE_MOT_DE_PASSE -X POST \\\n  --data-binary 'capteurs,sonde=s1 temperature=21.5' \\\n  https:\u002F\u002Fvotre-domaine\u002Fwrite\n```\n\nDesde tu código, un cliente oficial agrupa las líneas y gestiona los reintentos. En Python, tras `pip install questdb`:\n```python\nfrom questdb.ingress import Sender, TimestampNanos\n\nconf = \"https::addr=votre-domaine:443;username=admin;password=VOTRE_MOT_DE_PASSE;\"\nwith Sender.from_conf(conf) as sender:\n    sender.row(\n        \"capteurs\",\n        symbols={\"sonde\": \"s1\"},\n        columns={\"temperature\": 21.5},\n        at=TimestampNanos.now(),\n    )\n```",{"type":39,"title":110,"body":111},"Consultar tus series en SQL","En la consola web o mediante la API REST (`\u002Fexec?query=…`), el SQL estándar funciona y las extensiones de tiempo evitan consultas complicadas.\n```sql\n-- Moyenne horaire par sonde\nSELECT timestamp, sonde, avg(temperature)\nFROM capteurs\nSAMPLE BY 1h;\n\n-- Dernière valeur connue de chaque sonde\nSELECT * FROM capteurs LATEST ON timestamp PARTITION BY sonde;\n```\n\nUn programa que se ejecute en el propio VPS también puede conectarse por el protocolo PostgreSQL en `127.0.0.1:8812`, base `qdb`, usuario `admin` y la misma contraseña.",{"type":39,"title":113,"body":114},"Modelar bien una tabla de series temporales","La creación automática con la primera escritura basta para empezar. Para una tabla que va a durar, declárala tú mismo: eliges los tipos, la columna de tiempo y la partición.\n```sql\nCREATE TABLE capteurs (\n  timestamp TIMESTAMP,\n  sonde SYMBOL,\n  temperature DOUBLE\n) TIMESTAMP(timestamp) PARTITION BY DAY WAL\nDEDUP UPSERT KEYS(timestamp, sonde);\n```\n\nTres decisiones importan. **La columna de tiempo designada** (`TIMESTAMP(...)`) es la que QuestDB usa para ordenar y particionar: todas las extensiones de tiempo se apoyan en ella. **El tipo `SYMBOL`** conviene a las etiquetas repetidas (nombre de sonda, código de dispositivo, símbolo bursátil): el valor se guarda una vez y se referencia, lo que ahorra disco y acelera los filtros. **La partición** (`PARTITION BY DAY` u `HOUR`) se elige según el volumen: una partición debe tener un tamaño razonable, y es la unidad que borrarás más adelante.\n\nLa cláusula `DEDUP UPSERT KEYS` hace la ingesta idempotente: si un cliente reenvía la misma medición tras un corte de red, la fila se sustituye en lugar de duplicarse.",{"type":39,"title":116,"body":117},"Importar y exportar archivos CSV","La consola acepta archivos CSV arrastrándolos. Desde la línea de comandos, `\u002Fimp` importa un archivo en una tabla y `\u002Fexp` exporta el resultado de una consulta.\n```bash\ncurl -u admin:VOTRE_MOT_DE_PASSE -F data=@mesures.csv 'https:\u002F\u002Fvotre-domaine\u002Fimp?name=mesures'\ncurl -u admin:VOTRE_MOT_DE_PASSE -G --data-urlencode 'query=SELECT * FROM mesures' https:\u002F\u002Fvotre-domaine\u002Fexp > export.csv\n```",{"type":39,"title":119,"body":120},"Retención, disco y copia de seguridad","Nada caduca por sí solo. Elimina las particiones antiguas en SQL y programa el comando si hace falta. Para una copia coherente, congela el estado de la base mientras copias el volumen `questdb-data`.\n```sql\nALTER TABLE capteurs DROP PARTITION\nWHERE timestamp \u003C dateadd('d', -90, now());\n\nCHECKPOINT CREATE;\n-- copiez le volume questdb-data, puis :\nCHECKPOINT RELEASE;\n```",{"type":39,"title":122,"body":123},"Actualizar QuestDB","Lee las notas de la versión antes de pasar a una versión mayor, sustituye la etiqueta de la imagen y reinicia: los datos del volumen se conservan.\n```bash\ncd \u002Fopt\u002Fquestdb\n# changez le tag de l'image dans docker-compose.yml, puis :\ndocker compose pull && docker compose up -d\n```",{"type":39,"title":125,"body":126},"Errores frecuentes y solución de problemas","**401 en cada petición.** El usuario o la contraseña no coinciden con `QDB_HTTP_USER` y `QDB_HTTP_PASSWORD`. Revisa el archivo `.env` y reinicia el contenedor tras cualquier cambio: las variables solo se leen al arrancar.\n\n**413 al importar un CSV.** El archivo supera el límite de nginx. Aumenta `client_max_body_size` en el vhost, recarga nginx o divide el archivo.\n\n**El contenedor se reinicia en bucle.** Lee `docker compose logs questdb`. La causa más habitual es la memoria: QuestDB funciona sobre la JVM y un VPS de 1 GB no basta. Pasa a 2 GB como mínimo.\n\n**El disco se llena.** Nada caduca por defecto: programa el borrado de las particiones antiguas y vigila el tamaño del volumen `questdb-data` con `docker system df -v`.\n\n**Una aplicación del VPS no consigue conectarse por PostgreSQL.** Usa `127.0.0.1:8812`, la base `qdb`, el usuario `admin` y la contraseña del `.env`: la contraseña de fábrica `quest` se rechaza.",{"type":39,"title":128,"body":129},"Instalación en un clic desde el Marketplace de ServOrbit","En un VPS de ServOrbit, QuestDB se instala desde el Marketplace: el script despliega el contenedor oficial, genera la contraseña del usuario `admin`, activa la autenticación en la API HTTP y el protocolo PostgreSQL, desactiva la telemetría y configura nginx en HTTPS, en un subdominio de tu dominio o en el subdominio gratuito del VPS. La contraseña aparece en tu área de cliente.","Tus series temporales en tu propio VPS","Un VPS ServOrbit Ubuntu 24.04 con 2 GB de RAM basta para arrancar QuestDB. Instalación en un clic desde el Marketplace, HTTPS en tu dominio o en el subdominio gratuito del VPS y contraseña generada para ti.","Instalar QuestDB","\u002Fapplications\u002Fbases-de-datos\u002Fquestdb",[135,158,175],{"id":136,"slug":137,"slugs":138,"title":142,"excerpt":143,"readTime":144,"views":18,"isPinned":19,"noindex":19,"publishedAt":145,"updatedAt":146,"category":147,"categories":153,"featuredImage":30,"bgImage":31,"posterImage":155,"relatedSolution":156},64,"alojar-clickhouse-en-un-vps",{"fr":139,"en":140,"ar":141,"es":137},"heberger-clickhouse-vps","hosting-clickhouse-on-a-vps","استضافة-clickhouse-على-خادم-vps","Alojar ClickHouse en un VPS","Aloje ClickHouse en su VPS: base analítica en columnas para sus logs, métricas y dashboards. Guía de Docker, ajuste de memoria y SSL.",9,"2026-04-17T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":148,"name":149,"slug":150,"color":151,"icon":152},6,"Bases de datos","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[154],{"id":148,"name":149,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fheberger-clickhouse-vps-poster.svg",{"categorySlug":34,"appSlug":157},"clickhouse",{"id":159,"slug":160,"slugs":161,"title":165,"excerpt":166,"readTime":148,"views":18,"isPinned":19,"noindex":20,"publishedAt":167,"updatedAt":168,"category":169,"categories":170,"featuredImage":30,"bgImage":31,"posterImage":172,"relatedSolution":173},565,"autoalojar-greptimedb-vps-observabilidad-sql",{"fr":162,"en":163,"ar":164,"es":160},"self-host-greptimedb-vps","self-host-greptimedb-vps-observability-sql","استضافة-greptimedb-على-vps-قاعدة-بيانات-المراقبة","GreptimeDB en un VPS: métricas, logs y trazas en SQL","Instala GreptimeDB en un VPS: una base de observabilidad que reúne métricas, logs y trazas, consultables en SQL, en PromQL y desde Grafana.","2026-11-04T00:00:00+00:00","2026-11-04T16:30:20+00:00",{"id":17,"name":24,"slug":25,"color":26,"icon":27},[171],{"id":17,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-greptimedb-vps-poster.svg",{"categorySlug":34,"appSlug":174},"greptimedb",{"id":176,"slug":177,"slugs":178,"title":182,"excerpt":183,"readTime":144,"views":184,"isPinned":19,"noindex":19,"publishedAt":185,"updatedAt":186,"category":187,"categories":188,"featuredImage":30,"bgImage":31,"posterImage":190,"relatedSolution":191},56,"alojar-postgresql-en-un-vps",{"fr":179,"en":180,"ar":181,"es":177},"heberger-postgresql-vps","postgresql-on-a-vps-a-reliable-and-controlled-database","postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها","PostgreSQL en VPS: base de datos fiable y controlada","Aloje PostgreSQL en VPS: configuración prod, copias pgBackRest, HA streaming, comparativa RDS\u002FSupabase\u002FNeon y resolución de fallos OOM.",1,"2026-04-25T00:00:00+00:00","2026-10-21T15:21:37+00:00",{"id":148,"name":149,"slug":150,"color":151,"icon":152},[189],{"id":148,"name":149,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":34,"appSlug":192},"postgresql-stack",1794101246578]