Cómo instalar Supabase en un VPS
Supabase combina PostgreSQL con autenticación, APIs, storage y un dashboard para backends de aplicaciones. Su despliegue self-hosted es un stack Docker de varios servicios, por lo que esta guía usa los archivos Compose oficiales, protege secretos y expone solo el gateway público.
Requisitos previos
Elige Ubuntu 22.04 o 24.04 con SSH, IP pública y un dominio dedicado como api.example.com. Los mínimos oficiales son 4 GB RAM mínimo (8 GB recomendado), 2+ núcleos CPU, 40+ GB SSD. Una instalación de desarrollo puede usar una máquina modesta, pero producción necesita margen para PostgreSQL, logs, storage y migraciones.
Necesitas Docker Compose, una forma segura de generar secretos y almacenamiento externo al VPS para backups. Supabase autoalojado implica mantener el sistema operativo y la base de datos, no es una base de datos gestionada.
Paso 1, Conectarte a tu servidor
Conéctate y crea una carpeta protegida:
ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl git
mkdir -p /opt/supabase
cd /opt/supabase
chmod 750 /opt/supabaseAbre solo SSH, HTTP y HTTPS en el proveedor. No instales otro reverse proxy o PostgreSQL hasta entender los puertos del stack oficial.
Paso 2, Instalar Docker y Docker Compose
Instala Docker Engine y Compose siguiendo las instrucciones oficiales para Ubuntu. Comprueba la instalación:
docker --version
docker compose version
systemctl enable --now dockerRevisa el espacio y la memoria antes de descargar imágenes:
df -h
free -hPaso 3, Ejecutar el stack oficial de Supabase
Supabase mantiene la configuración Docker de self-hosting en su repositorio oficial. La forma recomendada de empezar es con el script de instalación oficial:
curl -fsSL https://supabase.link/setup.sh | shAlternativamente, clona el repositorio manualmente:
git clone --depth 1 https://github.com/supabase/supabase.git source
cd source/docker
cp .env.example .envSecretos y claves JWT
Supabase ahora usa pares de claves JWT asimétricas en lugar de un único JWT_SECRET. Después de clonar, genera las claves necesarias con los scripts auxiliares incluidos:
./docker/utils/generate-keys.sh
./docker/utils/add-new-auth-keys.shEstos scripts crean el par RSA para la firma JWT y añaden las nuevas claves a la configuración de auth. Los archivos docker/volumes/api/kong.yml gestionan el Gateway y docker/volumes/db/init/ maneja la base de datos.
Variables de entorno críticas
Abre .env y reemplaza cada valor placeholder. Los valores por defecto de .env.example son PELIGROSOS y nunca deben usarse en producción.
| Variable | Requisitos |
|---|---|
DASHBOARD_PASSWORD |
Debe contener al menos una letra (las contraseñas solo numéricas son rechazadas) |
POSTGRES_PASSWORD |
Usa solo letras y números para evitar problemas de codificación URL |
Todos los demás valores placeholder en .env también deben reemplazarse con valores únicos generados. Nunca publiques el archivo.
Usuarios Windows: Si clonas el repositorio en Windows, asegúrate de que los saltos de línea sean LF (estilo Unix). Los saltos CRLF rompen el entrypoint de Kong Gateway. Usa
git config --global core.autocrlf falseantes de clonar, o convierte condos2unix.
Valida el proyecto oficial antes de arrancar:
docker compose config
docker compose pull
docker compose up -d
docker compose psEl Compose oficial es el ejemplo de despliegue de esta guía. No lo reemplaces por un archivo corto, porque podrías eliminar el gateway, una migración o el servicio de storage.
Paso 4, Configurar el proxy inverso
Supabase incluye archivos de anulación oficiales para Caddy y Nginx. Actívalos con:
sh run.sh config add caddy
# o
sh run.sh config add nginxDirige api.example.com al puerto localhost del gateway indicado por el Compose oficial. Actualiza estas variables en .env para que coincidan con tu dominio:
SUPABASE_PUBLIC_URL=https://api.example.com
API_EXTERNAL_URL=https://api.example.com
SITE_URL=https://api.example.comTermina TLS en el proxy, conserva las cabeceras de host y protocolo y mantén PostgreSQL y los servicios internos en privado. Si necesitas Studio remotamente, protégelo mediante el método de tu versión, no abriendo todos los puertos.
WebSocket: Supabase Realtime necesita soporte WebSocket en tu proxy. Asegúrate de que la configuración de tu proxy inverso permita actualizaciones WebSocket (Caddy lo hace por defecto; Nginx necesita
proxy_set_header Upgrade $http_upgradeyproxy_set_header Connection "upgrade"de forma explícita).
Prueba el endpoint HTTPS, una petición autenticada y una operación de storage. Que cargue el dashboard no demuestra por sí solo que auth, migraciones y objetos estén bien.
Paso 5, Primer acceso y configuración inicial
Abre la dirección de Studio a través de la ruta protegida e inicia sesión con las credenciales de .env. Crea un proyecto de prueba o usa el proyecto por defecto solo para evaluar. Guarda la URL y la clave pública anónima en la configuración de tu aplicación, pero mantén las service-role keys en el servidor.
Crea una tabla, aplica una migración y prueba auth desde una aplicación desechable. Comprueba que row-level security está activado donde corresponda. Nunca uses una service-role key en código del navegador.
Mantenimiento
Haz backup de PostgreSQL, los objetos de storage y todos los secretos de entorno. Revisa las notas upstream antes de actualizar el repositorio y las imágenes. Toma un snapshot antes de migrar y verifica auth, APIs y storage después.
Monitoriza conexiones, disco, objetos, errores del gateway y salud de contenedores. Si falla un servicio, guarda docker compose ps, sus logs y la configuración efectiva antes de reiniciar o borrar nada.
Herramientas mencionadas
Supabase
↗Backend Postgres con base de datos, auth, storage, realtime y funciones edge.
2 proyectos, 500 MB de base de datos, 1 GB de storage, 5 GB de salida y 50.000 usuarios activos al mes.