①環境構築編:SupabaseをXserver VPSでセルフホスティング|Docker構成・SSL・独自ドメイン設定

Docker

今回のゴール

独自ドメインでhttpsアクセスするとSupabase Studioが表示される。

スクリーンショット 2026 01 16 23 38 54

例:https://aaa.etolog.jp みたいな(適当なので、アクセスしても何も出ません)

はじめに

最近バックエンドの勉強をしたいなーと思っていた
過去にRenderを使ってバックエンドを構築したが、結局複数プロジェクトを作るとなると無料枠を超えそうだし
何より15分くらいしたら、サーバがアイドル状態になるのが嫌だった(無料だから文句をいう筋合いはないが…)

PrismaでエックスサーバのMariaDBにアクセス+Renderでのデプロイ
はじめに最近自分のポートフォリオサイトを作り始めている。ポートフォリオサイトの一部データをDBで管理してみたいと考えた。現在自分はエックスサーバをレンタルしているため、そこで使えるMariaDBを使ってアクセスしよう!と思った。ポートフォリ...

調べてみるとなんとXserver Vpsが2025年の7月から、無料で使えるお試しプランができているではないか!
元々このブログと、別ブログがXserverで構築していたので
Xserver VPSにブログも移行してしまえば、ブログ運営+バックエンド開発できるじゃん!ということに気づいたので
試しに契約して使ってみた。

手始めとして、バックエンドを自分で実装するよりはBassで構築されたものを試したいなと思った。
その時Supabaseはセルフホスティングできると知ったので、すでに持っている独自ドメインのサブドメインを使って構築することにした。

システム概要

今回は独自ドメイン(サブドメイン)をSSL化して、そのURLにアクセスするとNginxがVPSサーバ内のDockerで構築している
Supabaseにアクセスするという構築にした。
こうすることで、今後Dockerコンテナを増やしてNginxでホスティングすることで他のサービス(WordPressやオリジナルバックエンド等)も使える
拡張性を持っているからだ。

XserverVPN の用意

今回はお試しなので無料プランを利用する
以下から、4GBの無料プランを契約する。
OSは今回はUbuntu 25.04で構築している

国内初!「完全無料」だから気軽にVPS体験。開発も、テストも、試用も。完全無料ではじめられる、新しいVPS。
国内初!「完全無料」だから気軽にVPS体験。開発も、テストも、試用も。完全無料ではじめられる、新しいVPS。

ちなみに、今回はSSHで作業をするので設定を忘れないこと

SSH Key | 圧倒的な性能・圧倒的なコスパVPS【XServer VPS】サポートサイト
SSH Keyの登録方法をご案内しています。

また、今回はSSHとWebからのアクセスを行う必要があるのでパケットフィルター設定から
WebとSSHの設定を有効化しておく必要がある。

スクリーンショット 2026 01 18 23 16 25

構築が終わったら、VPS管理画面からサーバのIPアドレスがどうなっているか確認する

スクリーンショット 2026-01-16 23.23.43.png

独自ドメインの準備

この設定はDNSの反映に最大72時間かかるので、とりあえずこの項目だけは先にやっておくことを進める

自分は元々お名前ドットコムで、独自ドメインを取得していたので
DNSレコードにサブドメインの追加をするだけだった。

もし、独自ドメインを取得するところから目指すなら以下を参考にすれば問題ないと思う。

お名前.comで取得したドメインをエックスサーバーで使うための設定方法
お名前ドットコム(お名前.com)で取得した独自ドメインを、エックスサーバー(Xserver)で使えるようにするための設定方法を紹介します。ドメインとサーバーを関連付け(紐付け)るためには、それぞれの管理画面で設定をする必要があります。

地味に引っかかったのは、DNSサーバをXserverにしていたのでお名前ドットコムで設定するのではなく
XServerのサーバ管理->DNSレコード設定 を選ぶことだった
ちなみに、XserverVPSの管理パネルではなくXserverのサーバ管理から行う必要があるのが要注意だ。

スクリーンショット 2026 01 16 23 30 10

DNSレコードはType Aとして値はXServer VPSのIPアドレスを指定すればOK
設定が反映されるまでには最大72時間程度掛かる可能性があるため、気長に待つべし

スクリーンショット 2026 01 16 23 53 53

パッケージ類の用意

前章で設定したsshでVPSにまずはログインする。
ログイン後は、今回必要なパッケージ類をインストールする。

# パッケージ更新
sudo apt update && sudo apt upgrade -y

# 必要なツールのインストール
sudo apt install -y git curl certbot python3-certbot-nginx

Dockerの構築

Dockerで環境するため、環境を作る。

# Docker公式のインストールスクリプトを使用
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Docker Compose の確認
docker compose version

Supabaseの設定

さてここからが本題、Supabaseの環境を導入していく
基本的には以下を参考に作っていく

Self-Hosting with Docker | Supabase Docs
Learn how to configure and deploy Supabase with Docker.

リポジトリのインストール

# リポジトリのクローン
git clone --depth 1 https://github.com/supabase/supabase

設定

Supabaseの環境周りを修正する
まずは、以下の手順で環境ファイルのテンプレをコピーする

cd supabase/docker
# 設定ファイルのコピー
cp .env.example .env

.envファイルの項目を修正していく。

DASHBOARD_USERNAME

DASHBOARD_USERNAME はWebからSupabase Studioの管理画面にアクセスするときに必要になるユーザID

DASHBOARD_USERNAME: username for Studio / dashboard

Studio authentication

DASHBOARD_PASSWORD

DASHBOARD_PASSWORD はWebからSupabaseStudioの管理画面にアクセスするときに必要になるパスワード

DASHBOARD_PASSWORD: password for Studio / dashboard

Studio authentication

JWT_SECRET

JWT_SECRETはJWT(署名付きトークン)に「本物の署名」をするための秘密鍵らしい。
そのため、外部には絶対に漏らさないように注意

JWT_SECRET: Used by PostgREST and GoTrue to sign and verify JWTs.
code.
Generate and configure API keys

以下コマンドで作成したkeyを貼り付ければOK

openssl rand -base64 32

ANON_KEY

ANON_KEYはクライアント側から認証をするときに使用する鍵になる。

ANON_KEY: Client-side API key with limited permissions (anon role). Use this in your frontend applications.
Generate and configure API keys

JWT_SECRETを使って鍵を生成する今回は以下のjwt.ioと使って作成する

JSON Web Tokens - jwt.io
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claim...

サイトへ飛んだら JWT Encoder を選択する、選択後は必要な情報を入力する必要があるので下記に例を乗せる

Headerは以下

{
  "alg": "HS256",
  "typ": "JWT"
}

Payloadは以下

{
  "role": "anon_key",
  "iss": "supabase",
  "iat": 1700000000,
  "exp": 1890000000
}

SignはJWT_SECRETを入力する。

上記を記入するとJSON Web Tokenが生成されるので、コピーしてANON_KEYにコピーする

SERVICE_ROLE_KEY

SERVICE_ROLE_KEYはバックエンドから認証をするときに使用する鍵になる。

SERVICE_ROLE_KEY: Server-side API key with full database access (service_role role). Never expose this in client code.
Generate and configure API keys

どういうことなんだ?と思っていたが、これが正しくないとSupabaseStudioから認証ユーザ作れなかったりしたから
鍵が違うとサーバ側での処理に不都合が出るようだ

JWT_SECRETを使って鍵を生成する今回は以下のjwt.ioと使って作成する

JSON Web Tokens - jwt.io
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claim...

サイトへ飛んだら JWT Encoder を選択する、選択後は必要な情報を入力する必要があるので下記に例を乗せる

Headerは以下

{
  "alg": "HS256",
  "typ": "JWT"
}

Payloadは以下

{
  "role": "service_role",
  "iss": "supabase",
  "iat": 1700000000,
  "exp": 1890000000
}

SignはJWT_SECRETを入力する。

上記を記入するとJSON Web Tokenが生成されるので、コピーしてSERVICE_ROLE_KEYにコピーする

SITE_URL

SITE_URLはSupabaseを紐づける独自ドメインを指定する(今回だとhttps://aaa.etolog.jp)

POSTGRES_PASSWORD

POSTGRES_PASSWORD は今後Supabase内で管理するDBのパスワードを設定する。

POSTGRES_PASSWORD: the password for the postgres and supabase_admin database roles
Configure database password

Nginxの設定

今回は、Supabaseはhttp://localhost:8080で動作をさせる。
そのため、ユーザは直接Supabase StudioにアクセスするわけではなくWebサーバを経由してアクセスするようにする。
今回はNginxを使用する

Supabaseは標準で 8000番ポートを使用するたね、443番 (HTTPS) で受けられるように設定も行う必要がある。

インストール

まずはNginxをインストールする

sudo apt install -y nginx

設定

インストール完了後は /etc/nginx/sites-available/supabase を作成して
以下の内容を貼り付けて保存する。(aaa.etolog.jpは各自のドメインに置き換えること)

server {
    listen 80;
    server_name aaa.etolog.jp;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

有効化

以下コマンドで、設定を有効化してNginxを起動する

sudo ln -s /etc/nginx/sites-available/supabase /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

SSL証明書の取得 (Certbot)

アクセス先をhttpではなくhttpsにするためにSSL証明を取得する。
以下コマンドで、SSL証明の取得をおこなう。

sudo certbot --nginx -d etolog.spabase.com

対話形式でメールアドレスなどを入力し、SSL化を完了させる。
これで Nginx の設定が自動的に HTTPS 対応に書き換えられる。

動作確認

ここまでの環境構築でいよいよSupabaseが起動できるはず!
準備が整ったので、Dockerコンテナを起動します。

cd ~/supabase/docker
sudo docker compose up -d

すべてのコンテナが running になったら完了

ブラウザで 設定したドメインにアクセスする(例:https://aaa.etolog.jp)
アクセス時にID、Passwordを聞かれるのでDASHBOARD_USERNAME,DASHBOARD_PASSWORD で設定した値を入力する
アクセスできたら成功!

最後に

ここまでで、Supabaseが使えるようになったはず。
自分はDNSの設定を間違えて、苦戦したので気をつけてほしい。

次回は、webアプリで実際にログインとDBの操作を行えるようなものを作成して
動作確認を行う方法を掲載予定

この記事を書いた人
あかちゃん

現職のフロントエンジニア&組み込みエンジニア(現在2社目)
仕事では、C,C++,C#やTypescript,JavaScript,Html,CSS等の技術をメインに仕事しています。
組み込みだけをメインに7年ほどやり、ここ数年でweb関係の仕事をするようになってきました。
現在Web技術は副業をするため絶賛修行中

記事にはなるべくQitaとか個人ブログじゃなくて、公式などの一次ソースをなるべく載せるようにしたい。

あかちゃんをフォローする
DockerNginx環境
あかちゃんをフォローする

コメント

タイトルとURLをコピーしました