Cómo instalar Supabase con Docker en Debian 11
Supabase es una alternativa de código abierto a Firebase que te proporciona todas las herramientas necesarias para desarrollar tus aplicaciones. Supabase ofrece una base de datos PostgreSQL, autenticación de usuarios, almacenamiento y una API en tiempo real, y se integra con marcos de trabajo y herramientas populares como Angular, Flutter, Next.js, React, Svelte y Vue.
Hay dos formas de utilizar Supabase. La primera opción es suscribirte a su aplicación alojada en la nube, que ofrece más funciones. La segunda opción es autoalojar el código utilizando Docker. Sin embargo, el autoalojamiento tiene algunas advertencias. No puedes crear ni gestionar proyectos. Además, todo el proyecto está en fase beta, y debes utilizar la versión autoalojada sólo para pruebas y desarrollo local. Para cualquier otro propósito, debes utilizar su aplicación en la nube.
En este tutorial, aprenderás a instalar Supabase en un servidor basado en Debian 11 y a proxyarlo mediante el servidor Nginx.
Requisitos previos
- Un servidor que ejecute Debian 11 con un mínimo de 2 GB de RAM.
- Un usuario no root con privilegios sudo.
- Un nombre de dominio (
supabase.example.com
) apuntando al servidor. - Todo actualizado.
$ sudo apt update && sudo apt upgrade
- Pocos paquetes que necesite tu sistema.
$ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y
Puede que algunos de estos paquetes ya estén instalados en tu sistema.
Paso 1 – Configurar el cortafuegos
El primer paso es configurar el cortafuegos. Debian viene con ufw (Cortafuegos sin complicaciones).
Comprueba si el cortafuegos está funcionando.
$ sudo ufw status
Deberías obtener la siguiente salida.
Status: inactive
Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.
$ sudo ufw allow OpenSSH
Permite también los puertos HTTP y HTTPS.
$ sudo ufw allow 80/tcp $ sudo ufw allow 443/tcp
Habilita el cortafuegos
$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
Comprueba de nuevo el estado del cortafuegos.
$ sudo ufw status
Deberías ver un resultado similar.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6)
Paso 2 – Instala Git
Instala Git.
$ sudo apt install git
Confirma la instalación.
$ git --version git version 2.30.2
Paso 3 – Instala Docker
Para instalar la última versión de Docker, añade la clave GPG oficial de Docker.
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Instala el repositorio oficial de Docker.
$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Actualiza los repositorios del sistema Debian.
$ sudo apt update
Instala la última versión de Docker.
$ sudo apt install docker-ce docker-ce-cli containerd.io
Comprueba que Docker se está ejecutando.
$ sudo systemctl status docker ? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-03-21 03:19:09 UTC; 9s ago TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 15816 (dockerd) Tasks: 7 Memory: 27.9M CPU: 566ms CGroup: /system.slice/docker.service ??15816 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Por defecto, Docker requiere privilegios de root. Si quieres evitar utilizar sudo
cada vez que ejecutes el comando docker
, añade tu nombre de usuario al grupo docker
.
$ sudo usermod -aG docker $(whoami)
Tienes que salir del servidor y volver a entrar como el mismo usuario para activar este cambio.
Paso 4 – Instala Docker Compose
La última versión disponible de Docker Compose es la 2.0.x, pero por motivos de compatibilidad, instalaremos la v1.29.2, más antigua y estable.
Ejecuta el siguiente comando para descargar la versión estable de Docker Compose.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Aplica permisos de ejecutable al archivo binario.
$ sudo chmod +x /usr/local/bin/docker-compose
Descarga e instala el script de finalización bash de Docker Compose.
$ sudo curl \ -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \ -o /etc/bash_completion.d/docker-compose
Ejecuta el siguiente comando para aplicar los cambios.
$ source ~/.bashrc
Paso 5 – Descarga y configura Supabase
Clona el repositorio Supabase de Github.
$ git clone --depth 1 https://github.com/supabase/supabase.git
El parámetro --depth 1
realiza un clon superficial del repositorio, es decir, sólo extrae los últimos commits y no todo el historial. Esto se hace para mejorar el rendimiento.
Cambia al directorio docker.
$ cd supabase/docker
Crea el archivo de entorno a partir del archivo de ejemplo.
$ cp .env.example .env
Abre el archivo recién creado para editarlo.
$ nano .env
Cambia el valor de la variable POSTGRES_PASSWORD
por una contraseña única fuertemente generada.
$ POSTGRES_PASSWORD=<yourpostgresqlpwd>
Genera otra contraseña única con más de 32 caracteres sin caracteres especiales. Sustituye el valor de JWT_SECRET
por esta contraseña.
JWT_SECRET=<your32pluscharacterspwd>
Puedes utilizar un generador de contraseñas online como Bitwarden o 1password para crear las contraseñas anteriores.
Abre el sitio web de Supabase e introduce tu JWT_SECRET
para generar un ANON_KEY
. Pega tu JWT_SECRET
en la casilla indicada, selecciona ANON_KEY
en el menú desplegable Carga útil preconfigurada y haz clic en el botón Generar JWT para generar el token.
Copia y pega este token como valor de ANON_KEY
en el archivo .env
.
Del mismo modo, repite los mismos pasos para generar el SERVICE_KEY
cambiando la Carga útil preconfigurada y pulsando el botón Generar JWT.
Copia el token generado y pégalo como valor para el SERVICE_KEY
en el archivo .env
.
Configura los ajustes SMTP del correo electrónico configurando las siguientes variables. Estamos utilizando el servicio SES de Amazon para nuestro tutorial.
[email protected] SMTP_HOST=email-smtp.us-west-2.amazonaws.com SMTP_PORT=587 SMTP_USER=<your_amazon_ses_user> SMTP_PASS=<your_amazon_ses_password> SMTP_SENDER_NAME=SupabaseAdmin
Configura la URL del sitio.
SITE_URL=https://supabase.example.com
Configura la URL REST pública.
PUBLIC_REST_URL=https://supabase.example.com/rest/v1/
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Los correos de autenticación enviados por SMTP tendrán enlaces rotos debido a un error frecuente en Supabase. Para solucionar este problema, abre el archivo docker-compose.yml
.
$ nano docker-compose.yml
Añade la variable API_EXTERNAL_URL
justo debajo de la variable GOTRUE_SITE_URL
para que tenga el siguiente aspecto.
GOTRUE_SITE_URL: ${SITE_URL} API_EXTERNAL_URL: ${SITE_URL}
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida. Este archivo se sobrescribirá cada vez que actualices tu instalación de Supabase. Con suerte, el error se corregirá la próxima vez. Tendrás que añadir esta variable manualmente para asegurarte de que no se repite el error del correo electrónico.
Abre el archivo volumes/api/kong.yml
para editarlo.
$ nano volumes/api/kong.yml
En la sección consumers
, sustituye la clave del usuario anon
por la ANON_KEY
generada anteriormente.
consumers: - username: anon keyauth_credentials: - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
Asimismo, sustituye la clave service_role
‘s por la SERVICE_KEY
generada anteriormente.
- username: service_role keyauth_credentials: - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Paso 6 – Instalar Supabase
Ejecuta Supabase utilizando el siguiente comando. Este proceso llevará algún tiempo.
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d
Comprueba el estado de los contenedores en ejecución.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d25393873731 supabase/storage-api:v0.10.0 "/bin/sh -c \"./stora…" About a minute ago Up About a minute 5000/tcp supabase-storage e6df7dcdd45b supabase/gotrue:v2.5.21 "gotrue" About a minute ago Up About a minute supabase-auth b3a758592d10 supabase/postgres-meta:v0.29.0 "postgres-meta" About a minute ago Up About a minute 0.0.0.0:5555->8080/tcp, :::5555->8080/tcp supabase-meta cdb18c248f79 supabase/realtime:v0.21.0 "bash -c './prod/rel…" About a minute ago Up About a minute supabase-realtime 71417337efae postgrest/postgrest:v9.0.0 "/bin/postgrest" About a minute ago Up About a minute 3000/tcp supabase-rest 2d51af16bd1f kong:2.1 "/docker-entrypoint.…" 2 minutes ago Up About a minute 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 8001/tcp, 0.0.0.0:8443->8443/tcp, :::8443->8443/tcp, 8444/tcp supabase-kong d6490380e4e8 supabase/postgres:14.1.0 "docker-entrypoint.s…" 2 minutes ago Up About a minute 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp supabase-db 40a49d1482fa supabase/studio:latest "docker-entrypoint.s…" 2 minutes ago Up About a minute 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp supabase-studio 3cce50db9782 inbucket/inbucket:stable "/start-inbucket.sh …" 2 minutes ago Up About a minute (healthy) 0.0.0.0:1100->1100/tcp, :::1100->1100/tcp, 0.0.0.0:2500->2500/tcp, :::2500->2500/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp supabase-mail
Paso 7 – Instalar SSL
Para instalar un certificado SSL utilizando Let’s Encrypt, necesitamos instalar la herramienta Certbot.
Para ello utilizaremos el instalador de paquetes Snapd. Como la mayoría de los servidores Debian no lo incluyen, instala el instalador de Snapd.
$ sudo apt install snapd
Asegúrate de que tu versión de Snapd está actualizada.
$ sudo snap install core && sudo snap refresh core
Instala Certbot.
$ sudo snap install --classic certbot
Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin
.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Verifica la instalación.
$ certbot --version certbot 1.25.0
Genera el certificado SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d supabase.example.com
El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/supabase.example.com
de tu servidor.
Genera un certificado de grupo Diffie-Hellman.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Crea un directorio webroot de desafío para la renovación automática de Let’s Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Crea un Cron Job para renovar el SSL. Se ejecutará cada día para comprobar el certificado y renovarlo si es necesario. Para ello, primero, crea el archivo /etc/cron.daily/certbot-renew
y ábrelo para editarlo.
$ sudo nano /etc/cron.daily/certbot-renew
Pega el siguiente código.
#!/bin/sh certbot renew --cert-name supabase.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.
Cambia los permisos del archivo de tareas para que sea ejecutable.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Paso 8 – Instalar y configurar Nginx
Debian incluye una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.
Importa la clave de firma oficial de Nginx.
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Añade el repositorio de la versión estable de Nginx.
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \ http://nginx.org/packages/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list
Actualiza los repositorios de Debian.
$ sudo apt update
Instala Nginx.
$ sudo apt install nginx
Verifica la instalación. Asegúrate de que utilizas sudo
cada vez que ejecutes el comando Nginx en Debian. De lo contrario, no funcionará.
$ sudo nginx -v nginx version: nginx/1.20.2
Crea y abre el archivo /etc/nginx/conf.d/supabase.conf
para editarlo.
$ sudo nano /etc/nginx/conf.d/supabase.conf
Pega en él el siguiente código.
map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream supabase { server localhost:3000; } upstream kong { server localhost:8000; } # enforce HTTPS server { listen 80; listen [::]:80; server_name supabase.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name supabase.example.com; access_log /var/log/nginx/supabase.access.log; error_log /var/log/nginx/supabase.error.log; gzip on; # SSL ssl_certificate /etc/letsencrypt/live/supabase.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/supabase.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/supabase.example.com/chain.pem; ssl_session_timeout 5m; ssl_session_cache shared:MozSSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; ssl_stapling on; ssl_stapling_verify on; ssl_dhparam /etc/ssl/certs/dhparam.pem; resolver 8.8.8.8; client_max_body_size 100m; # REST API location ~ ^/rest/v1/(.*)$ { proxy_set_header Host $host; proxy_pass http://kong; proxy_redirect off; } # Authentication location ~ ^/auth/v1/(.*)$ { proxy_set_header Host $host; proxy_pass http://kong; proxy_redirect off; } # Realtime location ~ ^/realtime/v1/(.*)$ { proxy_redirect off; proxy_pass http://kong; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; } # Studio location / { proxy_set_header Host $host; proxy_pass http://supabase; proxy_redirect off; proxy_set_header Upgrade $http_upgrade; } }
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida una vez hayas terminado.
Abre el archivo /etc/nginx/nginx.conf
para editarlo.
$ sudo nano /etc/nginx/nginx.conf
Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;
.
server_names_hash_bucket_size 64;
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Verifica la sintaxis del archivo de configuración de Nginx.
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Inicia el servicio Nginx para habilitar la nueva configuración.
$ sudo systemctl start nginx
Paso 9 – Accede a Supabase
Ahora puedes acceder a Supabase a través de la URL https://supabase.example.com
en tu navegador web.
No puedes crear nuevos proyectos, pero puedes gestionar los existentes y configurar la base de datos, el almacenamiento y la autenticación.
Paso 10 – Activar la autenticación HTTP
Supabase no proporciona gestión de usuarios, por lo que necesitas asegurar tu instalación de Supabase. La forma más sencilla de hacerlo es habilitar la autenticación HTTP mediante el servidor Nginx.
Instala el paquete apache2-utils
para Nginx.
$ sudo apt install apache2-utils
Crea un archivo de contraseña para el usuario supabase
. Puedes elegir el nombre de usuario que quieras. Te pedirá una nueva contraseña. Introduce una contraseña segura para terminar de configurar el archivo.
$ sudo htpasswd -c /etc/nginx/.htpasswd supabase New password: Re-type new password: Adding password for user supabase
La bandera -c
indica a la utilidad que cree un nuevo archivo. Si lo omites, deberás especificar la ubicación de un archivo existente.
Abre el archivo /etc/nginx/conf.d/supabase.conf
para editarlo.
$ sudo nano /etc/nginx/conf.d/supabase.conf
Realiza los cambios en las siguientes secciones del archivo, como se muestra a continuación.
# REST API location ~ ^/rest/v1/(.*)$ { auth_basic off; proxy_set_header Host $host; proxy_pass http://kong; proxy_redirect off; } # Authentication location ~ ^/auth/v1/(.*)$ { auth_basic off; proxy_set_header Host $host; proxy_pass http://kong; proxy_redirect off; } # Realtime location ~ ^/realtime/v1/(.*)$ { auth_basic off; proxy_redirect off; proxy_pass http://kong; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; } # Studio location / { auth_basic “Supabase Studio Login”; auth_basic_user_file /etc/nginx/.htpasswd; proxy_set_header Host $host; proxy_pass http://supabase; proxy_redirect off; proxy_set_header Upgrade $http_upgrade; }
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Verifica la configuración.
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Reinicia el servicio Nginx.
$ sudo systemctl restart nginx
La próxima vez que abras Supabase, te aparecerá la siguiente pantalla de inicio de sesión.
Paso 11 – Actualizar Supabase
Supabase es un producto en constante desarrollo y sufrirá cambios constantes. Si lo utilizas como instancia autoalojada, debes mantener actualizada tu instalación de Supabase.
Cambia al directorio de Supabase.
$ cd ~/supabase
Extrae el último repositorio de Github.
$ git pull
Busca cualquier cambio en los archivos docker/.env
, docker/volumes/api/kong.yml
para cualquier cosa que requiera reconfiguración.
Apaga y limpia los contenedores Docker existentes.
$ docker-compose down --remove-orphans
Extrae las últimas imágenes.
$ docker-compose pull
Arranca de nuevo los contenedores.
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d
Conclusión
Con esto concluye nuestro tutorial sobre la instalación de Supabase en un servidor basado en Debian 11 utilizando el servidor Nginx como proxy inverso. Si tienes alguna pregunta, publícala en los comentarios a continuación.