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.

Supabase ANON KEY Generator

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.

Generador de LLAVES DE SERVICIO Supabase

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.

Supabase Studio

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.

Autenticación HTTP Supabase Nginx

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.

También te podría gustar...