Supabase es una alternativa de Firebase de código abierto que le brinda todas las herramientas necesarias para desarrollar sus aplicaciones. Supabase ofrece una base de datos PostgreSQL, autenticación de usuarios, almacenamiento y una API en tiempo real y se integra con marcos y herramientas populares como Angular, Flutter, Next.js, React, Svelte y Vue.
Hay dos formas de usar Supabase. La primera opción es registrarse en su aplicación alojada en la nube, que ofrece más funciones. La segunda opción es autohospedar el código usando Docker. Sin embargo, hay algunas advertencias sobre el alojamiento propio. No puede crear ni administrar proyectos. Además, todo el proyecto se encuentra en la fase beta y debe usar la versión autohospedada solo para pruebas y desarrollo local. Para todos los demás fines, debe usar su aplicación en la nube.
En este tutorial, aprenderá cómo instalar Supabase en un servidor basado en Debian 11 y utilizarlo como proxy a través del servidor Nginx.
Requisitos
-
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 está actualizado.
$ sudo apt update && sudo apt upgrade
-
Pocos paquetes que tu sistema necesita.
$ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y
Es posible que algunos de estos paquetes ya estén instalados en su sistema.
Paso 1:configurar el cortafuegos
El primer paso es configurar el cortafuegos. Debian viene con ufw (cortafuegos sin complicaciones).
Compruebe si el cortafuegos se está ejecutando.
$ sudo ufw status
Deberías obtener el siguiente resultado.
Status: inactive
Permita el puerto SSH para que el cortafuegos no interrumpa la conexión actual al habilitarlo.
$ sudo ufw allow OpenSSH
Permitir puertos HTTP y HTTPS también.
$ sudo ufw allow 80/tcp $ sudo ufw allow 443/tcp
Habilitar 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
Vuelva a comprobar el estado del cortafuegos.
$ sudo ufw status
Debería 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:instalar Git
Instalar Git.
$ sudo apt install git
Confirme la instalación.
$ git --version git version 2.30.2
Paso 3:instalar Docker
Para instalar la última versión de Docker, agregue 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
Instale 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
Actualice los repositorios del sistema Debian.
$ sudo apt update
Instale la última versión de Docker.
$ sudo apt install docker-ce docker-ce-cli containerd.io
Verifique 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
De forma predeterminada, Docker requiere privilegios de root. Si desea evitar el uso de sudo
cada vez que ejecuta el docker
comando, agregue su nombre de usuario a la docker
grupo.
$ sudo usermod -aG docker $(whoami)
Debe cerrar sesión en el servidor y volver a iniciarla como el mismo usuario para habilitar este cambio.
Paso 4:instalar Docker Compose
La última versión disponible de Docker Compose es 2.0.x, pero por motivos de compatibilidad, instalaremos la versión 1.29.2, más antigua y estable.
Ejecute 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
Aplicar permisos ejecutables al archivo binario.
$ sudo chmod +x /usr/local/bin/docker-compose
Descargue e instale 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
Ejecute el siguiente comando para aplicar los cambios.
$ source ~/.bashrc
Paso 5:descargar y configurar Supabase
Clona el repositorio de Supabase Github.
$ git clone --depth 1 https://github.com/supabase/supabase.git
El --depth 1
El parámetro hace una clonación superficial del repositorio, es decir, solo extrae las últimas confirmaciones y no todo el historial. Esto se hace para mejorar el rendimiento.
Cambia al directorio docker.
$ cd supabase/docker
Cree el archivo de entorno a partir del archivo de ejemplo.
$ cp .env.example .env
Abra el archivo recién creado para editarlo.
$ nano .env
Cambia el valor de la variable POSTGRES_PASSWORD
con una contraseña única fuertemente generada.
$ POSTGRES_PASSWORD=<yourpostgresqlpwd>
Genere otra contraseña única con más de 32 caracteres sin caracteres especiales. Reemplace el valor de JWT_SECRET
con esta contraseña.
JWT_SECRET=<your32pluscharacterspwd>
Puede usar un generador de contraseñas en línea como Bitwarden o 1password para crear las contraseñas anteriores.
Abra el sitio web de Supabase e ingrese su JWT_SECRET
para generar una ANON_KEY
. Pega tu JWT_SECRET
en el cuadro especificado, seleccione ANON_KEY
de la carga útil preconfigurada menú desplegable y haga clic en Generar JWT botón para generar el token.
Copie y pegue este token como valor para ANON_KEY
en el .env
archivo.
Del mismo modo, repita los mismos pasos para generar la SERVICE_KEY
cambiando la carga útil preconfigurada y presionando Generar JWT botón.
Copie el token generado y péguelo como el valor de SERVICE_KEY
en el .env
archivo.
Configure 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
Configure la URL del sitio.
SITE_URL=https://supabase.example.com
Configure la URL REST pública.
PUBLIC_REST_URL=https://supabase.example.com/rest/v1/
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Los correos de autenticación enviados a través de SMTP tendrán enlaces rotos debido a un error frecuente en Supabase. Para solucionar este problema, abra docker-compose.yml
archivo.
$ nano docker-compose.yml
Agrega la variable API_EXTERNAL_URL
justo debajo de GOTRUE_SITE_URL
variable para que se parezca a lo siguiente.
GOTRUE_SITE_URL: ${SITE_URL} API_EXTERNAL_URL: ${SITE_URL}
Guarde el archivo presionando Ctrl + X e ingresando Y Cuando se le solicite. Este archivo se sobrescribirá cada vez que actualice su instalación de Supabase. Con suerte, el error se solucionará la próxima vez. Deberá agregar esta variable manualmente para asegurarse de que el error del correo electrónico no se repita.
Abra volumes/api/kong.yml
archivo para editar.
$ nano volumes/api/kong.yml
Bajo los consumers
sección, reemplace el anon
clave del usuario con ANON_KEY
generado antes.
consumers: - username: anon keyauth_credentials: - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
Además, reemplace el service_role
clave con SERVICE_KEY
generado arriba.
- username: service_role keyauth_credentials: - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Paso 6 - Instalar Supabase
Ejecute Supabase usando el siguiente comando. Este proceso llevará algún tiempo.
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d
Verifique 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 usando Let's Encrypt, necesitamos instalar la herramienta Certbot.
Usaremos el instalador del paquete Snapd para eso. Dado que la mayoría de los servidores Debian no lo incluyen, instale el instalador de Snapd.
$ sudo apt install snapd
Asegúrese de que su versión de Snapd esté actualizada.
$ sudo snap install core && sudo snap refresh core
Instale Certbot.
$ sudo snap install --classic certbot
Use el siguiente comando para asegurarse de que el comando Certbot se pueda ejecutar creando un enlace simbólico al /usr/bin
directorio.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Verifique la instalación.
$ certbot --version certbot 1.25.0
Genere 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 /etc/letsencrypt/live/supabase.example.com
directorio en su servidor.
Generar un grupo Diffie-Hellman certificado.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Cree un directorio webroot de desafío para la renovación automática de Let's Encrypt.
$ sudo mkdir -p /var/lib/letsencrypt
Cree un trabajo cron para renovar el SSL. Se ejecutará todos los días para verificar el certificado y renovarlo si es necesario. Para eso, primero crea el archivo /etc/cron.daily/certbot-renew
y ábralo para editarlo.
$ sudo nano /etc/cron.daily/certbot-renew
Pegue el siguiente código.
#!/bin/sh certbot renew --cert-name supabase.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Cambie los permisos en el archivo de tareas para que sea ejecutable.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Paso 8:instalar y configurar Nginx
Debian se envía con una versión anterior de Nginx. Debe descargar el repositorio oficial de Nginx para instalar la última versión.
Importe 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
Agregue el repositorio para 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
Actualice los repositorios de Debian.
$ sudo apt update
Instala Nginx.
$ sudo apt install nginx
Verifique la instalación. Asegúrate de usar sudo
cada vez que ejecuta el comando Nginx en Debian. De lo contrario, no funcionará.
$ sudo nginx -v nginx version: nginx/1.20.2
Cree y abra el archivo /etc/nginx/conf.d/supabase.conf
para editar.
$ sudo nano /etc/nginx/conf.d/supabase.conf
Pegue el siguiente código en él.
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; } }
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite una vez terminado.
Abra el archivo /etc/nginx/nginx.conf
para editar.
$ sudo nano /etc/nginx/nginx.conf
Agregue la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;
.
server_names_hash_bucket_size 64;
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Verifique 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
Inicie el servicio Nginx para habilitar la nueva configuración.
$ sudo systemctl start nginx
Paso 9 - Acceder a Supabase
Ahora puede acceder a Supabase a través de la URL https://supabase.example.com
en su navegador web.
No puede crear nuevos proyectos, pero puede administrar los existentes y configurar la base de datos, el almacenamiento y la autenticación.
Paso 10:habilitar la autenticación HTTP
Supabase no proporciona administración de usuarios, por lo que debe asegurar su instalación de Supabase. La forma más sencilla de hacerlo es habilitar la autenticación HTTP mediante el servidor Nginx.
Instalar apache2-utils
paquete para Nginx.
$ sudo apt install apache2-utils
Cree un archivo de contraseña para el usuario supabase
. Puede elegir cualquier nombre de usuario que desee. Le pedirá una nueva contraseña. Introduzca 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
El -c
flag le dice a la utilidad que cree un nuevo archivo. Si omite el archivo, debe especificar la ubicación de un archivo existente.
Abra el /etc/nginx/conf.d/supabase.conf
para editar.
$ sudo nano /etc/nginx/conf.d/supabase.conf
Realice 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; }
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Verifique 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
Reinicie el servicio Nginx.
$ sudo systemctl restart nginx
La próxima vez que abra Supabase, aparecerá la siguiente pantalla de inicio de sesión.
Paso 11 - Actualizar Supabase
Supabase es un producto de trabajo en progreso constante y sufrirá cambios constantes. Si lo usa como una instancia autohospedada, debe mantener actualizada su instalación de Supabase.
Cambie al directorio de Supabase.
$ cd ~/supabase
Obtenga el último repositorio de Github.
$ git pull
Busque cualquier cambio en docker/.env
, docker/volumes/api/kong.yml
archivos para cualquier cosa que requiera reconfiguración.
Apague y limpie los contenedores Docker existentes.
$ docker-compose down --remove-orphans
Obtenga las últimas imágenes.
$ docker-compose pull
Inicie los contenedores de nuevo.
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d
Conclusión
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 tiene alguna pregunta, publíquela en los comentarios a continuación.