Por qué autoalojar PocketBase en un VPS
PocketBase es un backend-as-a-service de código abierto distribuido como un único binario: sin Postgres separado, sin Redis, sin una pila compleja que orquestar. Todo funciona sobre SQLite, lo que lo hace perfectamente adecuado para un VPS de gama de entrada.
Al autoalojarlo, mantienes el control total de los datos de tus usuarios y sus archivos, sin depender de un Firebase o Supabase administrado con cuotas y latencia que pueden ser problemáticas según tu región. Un VPS te da una IP fija, un dominio personalizado y copias de seguridad que controlas completamente.
Como PocketBase escribe en una única carpeta pb_data, tu estrategia de backup se reduce a copiar ese directorio, lo que simplifica enormemente la operación comparado con un clúster de base de datos clásico.
Beneficios concretos de autoalojar PocketBase
- Un único binario para desplegar: arranca en segundos, huella de memoria mínima (a menudo menos de 100 MB de RAM).
- Base de datos SQLite integrada: cero servicios de base de datos que administrar, copia de seguridad copiando la carpeta
pb_data. - Autenticación completa (email/contraseña, OAuth2, OTP, LDAP) y reglas de acceso granulares por colección.
- API en tiempo real mediante Server-Sent Events para sincronizar automáticamente tus clientes.
- Interfaz de administración web completa para gestionar colecciones, usuarios, permisos y archivos.
- Soberanía de los datos: tus usuarios y sus archivos permanecen en tu infraestructura, detrás de tu dominio.
- Coste predecible: el precio del VPS no varía con el tráfico, a diferencia de la facturación por solicitud.
Requisitos precisos: VPS, sistema y software
PocketBase es extremadamente ligero. Aquí lo que necesitas según tu carga:
Mínimo absoluto: 1 vCPU, 512 MB de RAM. Suficiente para un proyecto en desarrollo o una aplicación pequeña con menos de 1.000 usuarios activos.
Recomendado en producción: 1 vCPU, 1 GB de RAM. PocketBase gestiona sin dificultad un proyecto de tamaño pequeño a mediano con esta configuración.
Para volúmenes altos: 2 vCPU, 2 GB de RAM. El límite suele ser la escritura concurrente en SQLite, no la CPU.
En cuanto al almacenamiento, planifica 20 a 40 GB SSD NVMe según el volumen de archivos. Evita sistemas de archivos de red (NFS) que pueden corromper la base de datos.
Software requerido: Docker 24+ y Docker Compose v2, un dominio apuntando a la IP del VPS mediante un registro A, un proxy inverso (Caddy, Nginx o Traefik) para gestionar TLS.
Desplegar PocketBase en VPS paso a paso
Preparar el VPS y el DNS
Conéctate por SSH, actualiza el sistema con
apt update && apt upgrade -y, luego instala Docker con el script oficial:curl -fsSL https://get.docker.com | sh. Añade tu usuario al grupo Docker conusermod -aG docker $USER.Crea un registro DNS de tipo A que apunte
app.your-domain.coma la IP pública de tu VPS. Verifica condig app.your-domain.com.Crear la estructura de archivos
Crea un directorio dedicado y el archivo de composición:
mkdir -p /opt/pocketbase && cd /opt/pocketbaseCrea el archivo
docker-compose.ymlcon el siguiente contenido:services: pocketbase: image: ghcr.io/muchobien/pocketbase:latest restart: unless-stopped volumes: - ./pb_data:/pb_data expose: - "8090"No publiques el puerto
8090directamente a Internet — deja que el proxy inverso lo gestione.Configurar HTTPS con Caddy (proxy inverso recomendado)
Caddy obtiene y renueva automáticamente los certificados Let's Encrypt. Crea
/opt/pocketbase/Caddyfile:app.your-domain.com { reverse_proxy pocketbase:8090 }Añade el servicio Caddy en
docker-compose.yml:caddy: image: caddy:2-alpine restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/data depends_on: - pocketbase volumes: caddy_data:Caddy activa WebSockets por defecto. Si prefieres Nginx, añade las cabeceras
UpgradeyConnectionen tulocation /.Arrancar y verificar
Inicia la pila con
docker compose up -dy sigue los logs:docker compose logs -f pocketbaseDeberías ver una línea indicando que PocketBase escucha en
0.0.0.0:8090. Verifica HTTPS concurl -I https://app.your-domain.com/_/— debe devolverHTTP/2 200.Crear la cuenta super-administrador
Abre
https://app.your-domain.com/_/en tu navegador. En el primer acceso, PocketBase te invita a crear una cuenta super-administrador (email + contraseña). Hazlo inmediatamente tras el arranque — antes de hacer pública la URL — porque cualquier persona que acceda a/_/puede crear esta primera cuenta en una instancia nueva.
Configurar autenticación OAuth (Google, GitHub, GitLab)
PocketBase soporta nativamente OAuth2 con varios proveedores: Google, GitHub, GitLab, Discord, Twitter/X, Microsoft, Apple y otros. La configuración se hace íntegramente desde la interfaz de administración.
Para Google OAuth:
1. Abre la Google Cloud Console, crea un proyecto y activa la API "OAuth consent screen".
2. En "Credentials", crea un "OAuth 2.0 Client ID" de tipo "Web application".
3. Añade https://app.your-domain.com/api/oauth2-redirect como URI de redirección autorizada.
4. Copia el Client ID y el Client secret.
5. En PocketBase /_/, ve a Settings → Auth providers → Google, actívalo y pega tus credenciales.
Para GitHub OAuth:
1. En GitHub, ve a Settings → Developer settings → OAuth Apps → New OAuth App.
2. Indica https://app.your-domain.com como Homepage URL y https://app.your-domain.com/api/oauth2-redirect como Authorization callback URL.
3. Copia el Client ID y genera un Client Secret.
4. Activa GitHub en Settings → Auth providers de PocketBase.
Cada proveedor activo aparecerá automáticamente en la página de login generada por PocketBase. Tu frontend solo necesita llamar a pb.collection('users').authWithOAuth2({ provider: 'google' }) mediante el SDK JavaScript.
Copias de seguridad automáticas: SQLite y archivos
PocketBase almacena todo en la carpeta pb_data: la base de datos SQLite (pb_data/data.db), los archivos subidos (pb_data/storage/) y los logs. Una copia de seguridad completa es simplemente archivar esa carpeta.
Método 1 — cron simple: añade esta línea a tu crontab (crontab -e) para un archivo diario a las 3am:
0 3 * * * tar czf /var/backups/pocketbase-$(date +\%F).tar.gz /opt/pocketbase/pb_data && find /var/backups -name 'pocketbase-*.tar.gz' -mtime +7 -deleteMétodo 2 — copias de seguridad integradas de PocketBase: desde /_/, ve a Settings → Backups. PocketBase puede crear archivos de pb_data desde el admin o mediante la API (POST /api/backups).
Método 3 — rclone a S3: para copia automática fuera del servidor:
0 4 * * * rclone sync /opt/pocketbase/pb_data your-remote:pocketbase-backup/Conserva siempre una copia fuera del servidor — si el disco falla, una copia solo local no sirve de nada.
Modo WAL de SQLite y rendimiento
PocketBase activa el modo WAL (Write-Ahead Logging) de SQLite por defecto en versiones recientes. Este modo permite lecturas concurrentes durante las escrituras, evitando que una inserción bloquee todas las lecturas. Si experimentas timeouts bajo carga alta, verifica con PRAGMA journal_mode; en el admin SQL — la respuesta debe ser wal.
Para tráfico elevado, coloca pb_data en un volumen NVMe y evita cualquier sistema de archivos de red.
Resolución de problemas: errores comunes
Puerto ya en uso: si docker compose up falla con bind: address already in use, verifica con ss -tlnp | grep ':80' qué servicio ocupa el puerto. Detén nginx o Apache (systemctl stop nginx) o cambia sus puertos.
Permisos en pb_data: PocketBase corre como usuario nobody (UID 65534) en el contenedor oficial. Si montaste una carpeta creada por root, el proceso no puede escribir. Corrige con chown -R 65534:65534 /opt/pocketbase/pb_data.
/_/ inaccesible tras el arranque: verifica que el proxy inverso apunte al nombre del servicio Docker (pocketbase:8090) y no a localhost:8090.
Actualizar PocketBase: cambia el tag de la imagen en docker-compose.yml luego docker compose pull && docker compose up -d. PocketBase aplica migraciones de esquema automáticamente. Haz una copia de seguridad de pb_data antes de cualquier actualización mayor.
Certificado Let's Encrypt no obtenido: Caddy necesita los puertos 80 y 443 accesibles desde Internet. Verifica tu firewall (ufw status).
Para ir más lejos: CLI admin, colecciones y hooks
CLI de administración: PocketBase expone una CLI para operaciones comunes. Desde el contenedor: docker exec -it pocketbase_pocketbase_1 /pb/pocketbase --help.
Colecciones personalizadas: en /_/, crea tus colecciones (equivalentes a tablas) definiendo campos tipados. Las reglas de API se expresan en sintaxis PocketBase (@request.auth.id != "" para restringir a usuarios autenticados).
Hooks (JavaScript del lado del servidor): desde PocketBase v0.17, puedes extender el backend con scripts JavaScript del lado del servidor (pb_hooks/*.pb.js). Ejemplos: enviar un email al crear un usuario, validar datos complejos, disparar un webhook. Estos hooks son archivos montados en el contenedor:
volumes:
- ./pb_data:/pb_data
- ./pb_hooks:/pb_hooksSDK JavaScript: el SDK oficial (npm install pocketbase) simplifica las llamadas desde tu frontend React, Vue o móvil. Gestiona la autenticación, el refresco del token y las suscripciones en tiempo real (pb.collection('tasks').subscribe('*', callback)).
PocketBase vs alternativas self-hosted
Desplace la tabla
| Criterio | PocketBase | Supabase self-hosted | Appwrite |
|---|---|---|---|
| Complejidad de instalación | Muy baja (1 binario o 1 contenedor) | Alta (10+ servicios) | Media (6 servicios) |
| RAM mínima | 512 MB | 4 GB+ | 2 GB+ |
| Base de datos | SQLite integrado | PostgreSQL | MariaDB |
| Autenticación OAuth | Sí (nativa) | Sí (GoTrue) | Sí (nativa) |
| Tiempo real | Server-Sent Events | WebSocket | WebSocket |
| Almacenamiento de archivos | Sí (local + S3) | Sí (compatible S3) | Sí (local + S3) |
| Escalado horizontal | No (SQLite archivo único) | Sí (PostgreSQL) | Limitado |
Documentación oficial
Para configuración avanzada y opciones específicas de la herramienta, consulta la documentación oficial de PocketBase. Esta guía cubre el despliegue en VPS; la documentación del editor es la referencia para ajustes finos, actualizaciones mayores y casos de uso específicos.
Si quieres probar PocketBase sin Docker, descarga el binario Linux desde github.com/pocketbase/pocketbase/releases, ejecuta ./pocketbase serve --http=0.0.0.0:8090 y crea un servicio systemd para que se reinicie automáticamente. Este enfoque es incluso más ligero que Docker en VPS pequeños.