如何在 Debian 11 上使用 Docker 安装 Supabase
在此页
- 先决条件
- 第 1 步 - 配置防火墙
- 第 2 步 - 安装 Git
- 第 3 步 - 安装 Docker
- 第 4 步 - 安装 Docker Compose
- 第 5 步 - 下载并配置 Supabase
- 第 6 步 - 安装 Supabase
- 第 7 步 - 安装 SSL
- 第 8 步 - 安装和配置 Nginx
- 第 9 步 - 访问 Supabase
- 第 10 步 - 启用 HTTP 身份验证
- 第 11 步 - 更新 Supabase
- 结论
Supabase 是一种开源的 Firebase 替代品,可为您提供开发应用程序所需的所有工具。 Supabase 提供 PostgreSQL 数据库、用户身份验证、存储和实时 API,并与流行的框架和工具集成,例如 Angular、Flutter、Next.js、React、Svelte 和 Vue。
有两种使用 Supabase 的方法。第一个选择是注册他们的云托管应用程序,该应用程序提供更多功能。第二种选择是使用 Docker 自托管代码。不过,关于自托管有一些注意事项。您不能创建或管理项目。此外,整个项目处于测试阶段,您应该使用自托管版本仅用于测试和本地开发。对于所有其他目的,您应该使用他们的云应用程序。
在本教程中,您将学习如何在基于 Debian 11 的服务器上安装 Supabase 并通过 Nginx 服务器代理它。
先决条件
-
A server running Debian 11 with a minimum of 2GB RAM.
-
A non-root user with sudo privileges.
-
A Domain name (
supabase.example.com
) pointing to the server. -
Everything is updated.
$ sudo apt update && sudo apt upgrade
-
Few packages that your system needs.
$ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y
Some of these packages may already be installed on your system.
第 1 步 - 配置防火墙
第一步是配置防火墙。 Debian 带有 ufw(简单防火墙)。
检查防火墙是否正在运行。
$ sudo ufw status
您应该得到以下输出。
Status: inactive
允许 SSH 端口,以便防火墙在启用时不会中断当前连接。
$ sudo ufw allow OpenSSH
也允许 HTTP 和 HTTPS 端口。
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
启用防火墙
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
再次检查防火墙的状态。
$ sudo ufw status
您应该会看到类似的输出。
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)
第 2 步 - 安装 Git
安装 Git。
$ sudo apt install git
确认安装。
$ git --version
git version 2.30.2
第 3 步 - 安装 Docker
要安装最新版本的 Docker,请添加 Dockers 官方 GPG 密钥。
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
安装官方 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
更新 Debian 系统存储库。
$ sudo apt update
安装最新版本的 Docker。
$ sudo apt install docker-ce docker-ce-cli containerd.io
验证 Docker 是否正在运行。
$ 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
默认情况下,Docker 需要 root 权限。如果您想避免每次运行 docker
命令时都使用 sudo
,请将您的用户名添加到 docker
组。
$ sudo usermod -aG docker $(whoami)
您需要注销服务器并以同一用户身份重新登录才能启用此更改。
第 4 步 - 安装 Docker Compose
Docker Compose 的最新可用版本是 2.0.x,但出于兼容性原因,我们将安装较旧且稳定的 v1.29.2。
运行以下命令以下载 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
对二进制文件应用可执行权限。
$ sudo chmod +x /usr/local/bin/docker-compose
下载并安装 Docker Composes bash 完成脚本。
$ sudo curl \
-L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \
-o /etc/bash_completion.d/docker-compose
运行以下命令以应用更改。
$ source ~/.bashrc
第 5 步 - 下载并配置 Supabase
克隆 Supabase Github 存储库。
$ git clone --depth 1 https://github.com/supabase/supabase.git
--depth 1
参数对存储库进行浅层克隆,即它只提取最新的提交,而不是整个历史记录。这样做是为了提高性能。
切换到 docker 目录。
$ cd supabase/docker
从示例文件创建环境文件。
$ cp .env.example .env
打开新创建的文件进行编辑。
$ nano .env
使用强生成的唯一密码更改变量 POSTGRES_PASSWORD
的值。
$ POSTGRES_PASSWORD=<yourpostgresqlpwd>
生成另一个超过 32 个字符且没有特殊字符的唯一密码。用此密码替换 JWT_SECRET
的值。
JWT_SECRET=<your32pluscharacterspwd>
您可以使用 1password 等在线密码生成器来创建上述密码。
打开 Supabase 网站并输入你的 JWT_SECRET
以生成一个 ANON_KEY
。将您的 JWT_SECRET
粘贴到指定的框中,从 Preconfigured Payload 下拉菜单中选择 ANON_KEY
,然后单击 Generate JWT 按钮以生成令牌。

将此标记复制并粘贴到 .env
文件中作为 ANON_KEY
的值。
同样,通过切换预配置负载并按下生成 JWT 按钮,重复生成 SERVICE_KEY
的相同步骤。

复制生成的令牌并将其作为 SERVICE_KEY
的值粘贴到 .env
文件中。
通过配置以下变量来配置电子邮件 SMTP 设置。我们在教程中使用亚马逊的 SES 服务。
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
配置站点 URL。
SITE_URL=https://supabase.example.com
配置公共 REST URL。
PUBLIC_REST_URL=https://supabase.example.com/rest/v1/
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
由于 Supabase 中普遍存在的错误,通过 SMTP 发送的身份验证邮件将有断开的链接。要解决此问题,请打开 docker-compose.yml
文件。
$ nano docker-compose.yml
在 GOTRUE_SITE_URL
变量正下方添加变量 API_EXTERNAL_URL
如下所示。
GOTRUE_SITE_URL: ${SITE_URL}
API_EXTERNAL_URL: ${SITE_URL}
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。每次升级 Supabase 安装时,此文件都会被覆盖。希望下次能修复该错误。您将需要手动添加此变量以确保电子邮件错误不会重复出现。
打开 volumes/api/kong.yml
文件进行编辑。
$ nano volumes/api/kong.yml
在 consumers
部分下,将 anon
用户密钥替换为之前生成的 ANON_KEY
。
consumers:
- username: anon
keyauth_credentials:
- key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
此外,将 service_role
的密钥替换为上面生成的 SERVICE_KEY
。
- username: service_role
keyauth_credentials:
- key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
第 6 步 - 安装 Supabase
使用以下命令运行 Supabase。这个过程需要一些时间。
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d
检查正在运行的容器的状态。
$ 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
第 7 步 - 安装 SSL
要使用 Lets Encrypt 安装 SSL 证书,我们需要安装 Certbot 工具。
为此,我们将使用 Snapd 包安装程序。由于大多数 Debian 服务器不附带它,请安装 Snapd 安装程序。
$ sudo apt install snapd
确保您的 Snapd 版本是最新的。
$ sudo snap install core && sudo snap refresh core
安装 Certbot。
$ sudo snap install --classic certbot
使用以下命令确保可以通过创建指向 /usr/bin
目录的符号链接来运行 Certbot 命令。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
验证安装。
$ certbot --version
certbot 1.25.0
生成 SSL 证书。
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m -d supabase.example.com
上面的命令会将证书下载到服务器上的 /etc/letsencrypt/live/supabase.example.com
目录。
生成 Diffie-Hellman 组证书。
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
为 Lets Encrypt 自动更新创建一个挑战 webroot 目录。
$ sudo mkdir -p /var/lib/letsencrypt
创建 Cron 作业以更新 SSL。它将每天运行以检查证书并在需要时更新。为此,首先,创建文件 /etc/cron.daily/certbot-renew
并打开它进行编辑。
$ sudo nano /etc/cron.daily/certbot-renew
粘贴以下代码。
#!/bin/sh
certbot renew --cert-name supabase.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
更改任务文件的权限以使其可执行。
$ sudo chmod +x /etc/cron.daily/certbot-renew
第 8 步 - 安装和配置 Nginx
Debian 附带旧版本的 Nginx。您需要下载官方 Nginx 存储库以安装最新版本。
导入官方 Nginx 签名密钥。
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
添加 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
更新 Debian 存储库。
$ sudo apt update
安装 Nginx。
$ sudo apt install nginx
验证安装。确保每次在 Debian 上运行 Nginx 命令时都使用 sudo
。否则,它不会工作。
$ sudo nginx -v
nginx version: nginx/1.20.2
创建并打开文件 /etc/nginx/conf.d/supabase.conf
进行编辑。
$ sudo nano /etc/nginx/conf.d/supabase.conf
将以下代码粘贴到其中。
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;
}
}
完成后按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
打开文件 /etc/nginx/nginx.conf
进行编辑。
$ sudo nano /etc/nginx/nginx.conf
在行 include /etc/nginx/conf.d/*.conf;
之前添加以下行。
server_names_hash_bucket_size 64;
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
验证 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
启动 Nginx 服务以启用新配置。
$ sudo systemctl start nginx
第 9 步 - 访问 Supabase
您现在可以在网络浏览器中通过 URL https://supabase.example.com
访问 Supabase。

您无法创建新项目,但可以管理现有项目并配置数据库、存储和身份验证。
第 10 步 - 启用 HTTP 身份验证
Supabase 不提供用户管理,因此您需要保护您的 Supabase 安装。最简单的方法是使用 Nginx 服务器启用 HTTP 身份验证。
为 Nginx 安装 apache2-utils
包。
$ sudo apt install apache2-utils
为用户 supabase
创建一个密码文件。您可以选择任何您想要的用户名。它将提示您输入新密码。输入强密码以完成文件设置。
$ sudo htpasswd -c /etc/nginx/.htpasswd supabase
New password:
Re-type new password:
Adding password for user supabase
-c
标志告诉实用程序创建一个新文件。如果省略该文件,则需要指定现有文件的位置。
打开 /etc/nginx/conf.d/supabase.conf
进行编辑。
$ sudo nano /etc/nginx/conf.d/supabase.conf
在文件的以下部分中进行更改,如下所示。
# 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;
}
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
验证配置。
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启 Nginx 服务。
$ sudo systemctl restart nginx
下次打开 Supabase 时,您将看到以下登录屏幕。

第 11 步 - 更新 Supabase
Supabase 是一个不断完善的产品,并且会不断发生变化。如果将其用作自托管实例,则必须更新 Supabase 安装。
切换到 Supabase 目录。
$ cd ~/supabase
拉取最新的 Github 存储库。
$ git pull
在 docker/.env
、docker/volumes/api/kong.yml
文件中查找任何需要重新配置的更改。
关闭并清理现有的 Docker 容器。
$ docker-compose down --remove-orphans
拉取最新的镜像。
$ docker-compose pull
再次启动容器。
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d
结论
我们关于使用 Nginx 服务器作为反向代理在基于 Debian 11 的服务器上安装 Supabase 的教程到此结束。如果您有任何问题,请在下面的评论中发表。