エクスポートとセルフホスティング

アプリをプラットフォームの外に持ち出す方法:ソースをダウンロードし、ローカルで実行し、バックエンドを自分の Supabase プロジェクトに移行します。

更新日 2026-09-14

アプリは MeDo に縛られていません。完全なソースをダウンロードし、自分のインフラで実行できます。

こんなときに行います

  • コンプライアンスや社内ポリシーのため、自社サーバーでホストする必要がある。
  • 開発者がプロジェクトを引き継ぎ、自分のリポジトリで管理したい。
  • プラットフォームが生成する範囲を超えて開発を続けたい。
  • すべてを自分で所有したいクライアントにプロジェクトを引き渡す。

どれにも当てはまらないなら、MeDo に残る方が簡単です。ホスティング、バックエンド、更新はすべて代わりに処理されます。

費用と必要な作業

ダウンロードごとに 300 クレジット かかります。それに加えて、セルフホスティングでは MeDo が担っていた部分、つまりデータベースの用意、関数のデプロイ、キーの管理、フロントエンドのホスティングを自分で引き受けることになります。初回の移行には 1 時間ほど見込み、ターミナルが必要になると考えてください。

注意: アプリがデータを保存しない純粋なフロントエンドの場合は、セクション 1〜4 だけ行い、セクション 9 でローカル実行すれば十分です。アプリがデータを保存する場合は、全体の流れに沿って自分の Supabase プロジェクトに構造を再構築してください。

1. ダウンロードに含まれるもの・含まれないもの

Download Code(コードをダウンロード) で得られる ZIP には、バックエンドの 構造と関数のコード が含まれます。データ、ファイル、キーは含まれません。これが移行で何をするかを決めます。

内容パッケージに含まれる?場所
フロントエンドのソース(Vite + TS + React)はいsrc/
テーブル構造 / RLS ポリシー / DB 関数 / トリガーはいsupabase/schema.sql
生のマイグレーションスクリプトはいsupabase/migrations/
Edge Functions のコードあれば、はいsupabase/functions/**/*.ts
.env(Supabase URL + anon key)はいプロジェクトルートの .env
テーブルの行データいいえソースデータベースからエクスポートする必要があります(多くのユーザーはアクセスできません。セクション 8 を参照)
Storage 内のファイルいいえ別途移行する必要があります
Edge Function のシークレットいいえ自分のプロジェクトで再設定する必要があります
service_role keyいいえプラットフォームにより除去済み。自分のものを使います

注意: .env の URL と anon key は MeDo がホストするバックエンドを指しています。置き換えないと、ローカルのアプリは自分のデータベースではなく、引き続きプラットフォームと通信します。移行の核心は「構造を再構築し、この 2 つの値を入れ替える」ことです。

2. アプリのコードをダウンロードする

  1. エディターでアプリを開きます。ダウンロードは Pro と Max の機能で、完了済みの生成が必要です。生成が終わるまで待ってください。
  2. 上部バーの Download Code アイコン(クレジット残高の左側)をクリックします。ポップオーバーに、パッケージにはさらに開発を進めるための README.md が含まれる旨が表示されます。
  3. Download Code をクリックして確定します。ダウンロードには 300 クレジット かかります。

エディター上部バーの Download Code ポップオーバー

現在編集中のバージョンが得られます。Edit モードや Code ビューでフォント、色、コンテンツを変更した場合は、先に公開して、その変更がパッケージに含まれるようにしてください。

3. ソースを解凍する

ダウンロードしたパッケージを解凍し、ディレクトリに入ります。

cd ~/Downloads
unzip -o your-app.zip -d your-app
cd your-app/app-xxxxxxxx        # enter the folder containing package.json

# verify structure
ls -la                          # should show package.json, src/, supabase/, .env
ls -la supabase/
test -f supabase/schema.sql && echo "has schema.sql (full import)" || echo "no schema.sql (use migrations)"

典型的な構造は次のとおりです。

app-xxxxxxxx/
├── .env                    # VITE_SUPABASE_URL / VITE_SUPABASE_ANON_KEY
├── package.json
├── src/                    # frontend source
│   └── db/supabase.ts      # createClient(url, anonKey)
└── supabase/
    ├── config.toml
    ├── migrations/         # raw migration scripts
    └── schema.sql          # full structure: tables, RLS, functions, triggers, storage bucket

注意: schema.sql がある場合はそれを使います(セクション 5、フルインポート)。ない場合は supabase db push を実行してマイグレーションを適用します。

4. ツールを準備する

コードの編集には VSCode、IntelliJ IDEA、または好みの IDE を使えます。アプリの実行と移行には 3 つのツールが必要です。Node.js 20 以降、Supabase CLI、psql(Postgres クライアント)です。

macOS で Homebrew を使う場合:

brew install node                    # Node.js 20+ (or use the installer at https://nodejs.org)
brew install supabase/tap/supabase   # Supabase CLI
brew install libpq && brew link --force libpq   # psql / pg_dump

注意: libpq は keg-only です。psql が引き続き「command not found」と報告される場合は、echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc で PATH に追加し、ターミナルを再度開いてください。

Windows では、Node.js LTS、Scoop 経由の Supabase CLI(scoop install supabase)、PostgreSQL(psql を含む)をインストールします。以下のコマンドは同一で、export PATH=... の行だけが macOS 固有です。

Linux では、Node 20 以降、リリースバイナリからの Supabase CLI、パッケージマネージャー経由の psql(たとえば sudo apt install postgresql-client)をインストールします。

3 つすべてがバージョンを表示することを確認します。

node -v && npm -v      # node 20 or later
supabase --version     # e.g. 2.109.1
psql --version         # e.g. psql (PostgreSQL) 18.4

注意: アプリがバックエンドのない純粋なフロントエンドなら、セクション 9 に進んで今すぐローカルで実行してください。Supabase の手順(セクション 5〜8)は、バックエンドにデータを保存するアプリにのみ該当します。

5. 自分の Supabase プロジェクトを作成する

Supabase アカウントをまだ持っていない場合

https://supabase.com にアクセスし、Start your project をクリックして、GitHub またはメールでサインアップします(無料)。MeDo アプリ 1 つの移行なら Free プランで十分です。

無料枠上限アプリ 1 つの使用量
データベースサイズ500 MB約 27 MB
ファイルストレージ1 GBファイルをアップロードしなければ 0
月間アクティブユーザー50,000アプリによる
同時アクティブプロジェクト数21

Free プランの枠を表示している Supabase の組織ホーム

注意: Free プランで同時にアクティブにできるプロジェクトは最大 2 つです。すでに 2 つある場合は、先に 1 つを一時停止しないと新規作成できません。

プロジェクトを作成する

組織ホームで New project をクリックし、次を入力します。

  • Project name、たとえば taskflow-migrate
  • Database password:Generate a password をクリックして強力なパスワードを生成し、必ずコピーして保存します(スキーマのインポートに必要です。紛失した場合はリセットするしかありません)
  • Region:ユーザーに最も近いものを選びます

名前、パスワード、リージョンの項目がある Supabase の New project フォーム

Create new project をクリックし、プロビジョニングが完了するまで 1〜2 分待ちます。

プロビジョニング中の Supabase プロジェクト

4 つの認証情報を集める

Project Settings に移動し、次を記録します。以降のすべての手順で必要です。

認証情報場所用途
Project URL(https://<ref>.supabase.co)Settings → Data API.env に書き戻す
anon / publishable keySettings → API Keys.env に書き戻す
データベース接続文字列 / パスワードSettings → Database(および前の手順のパスワード)スキーマのインポート
service_role / secret keySettings → API Keysバックエンドスクリプトと管理操作。フロントエンドには使わない

注意: anon key は設計上公開されるもので(RLS で保護)、フロントエンドの .env に入れて構いません。service_role / secret key はフルアクセスのキーです。フロントエンドに置いたり git にコミットしたりしないでください。

6. データベース構造をインポートする

セクション 5 のデータベース接続文字列を使って、schema.sql を新しいデータベースに読み込みます。文字列は postgresql://postgres:<your-DB-password>@db.<project-ref>.supabase.co:5432/postgres のような形です。

cd ~/Downloads/your-app/app-xxxxxxxx
export PATH="/opt/homebrew/opt/libpq/bin:$PATH"

# full import (when schema.sql exists)
psql "postgresql://postgres:<DB-password>@db.<ref>.supabase.co:5432/postgres" \
  -v ON_ERROR_STOP=0 -f supabase/schema.sql

注意: MeDo の schema.sql は防御的な構文(CREATE TABLE IF NOT EXISTS、DO $$ ... EXECUTE で包んだストレージポリシー、ON CONFLICT DO UPDATE 付きのバケット)を使っているため、新規プロジェクトへのインポートは競合なく実行できます。

schema.sql がない場合は、代わりに CLI でマイグレーションを適用します。

supabase login
supabase link --project-ref <your-project-ref>
supabase db push

インポートを確認する

DBURL="postgresql://postgres:<DB-password>@db.<ref>.supabase.co:5432/postgres"
psql "$DBURL" -c "\dt public.*"                                                   # tables
psql "$DBURL" -tc "select count(*) from pg_policies where schemaname='public';"  # RLS policy count
psql "$DBURL" -tc "select tgname from pg_trigger where tgrelid='auth.users'::regclass and not tgisinternal;"  # triggers

移行したテーブルは Supabase の Table Editor でも直接確認できます。

移行したテーブルを表示している Supabase の Table Editor

7. Edge Functions をデプロイしてシークレットを設定する

まず、パッケージに関数があるか確認します。

ls supabase/functions/ 2>/dev/null

関数がない場合(多くのアプリは anon と RLS だけで、サーバー側の関数を持ちません)は、このセクションをスキップします。

関数がある場合は、デプロイしてシークレットを再設定します。

# 1) deploy all functions
supabase functions deploy --project-ref <your-project-ref>
# or one by one: supabase functions deploy <function-name>

# 2) find which secrets the functions use (Deno.env.get in source)
grep -rhoE "Deno\.env\.get\(['\"][^'\"]+['\"]\)" supabase/functions | sort -u

# 3) set them one by one (values from your own services)
supabase secrets set MY_API_KEY=xxxx --project-ref <your-project-ref>
supabase secrets list --project-ref <your-project-ref>

注意: 関数のシークレットはソースパッケージに含まれないため、手動で再設定する必要があります。サードパーティの API キーや、関数内で参照される SUPABASE_SERVICE_ROLE_KEY などです。

8. データを移行する(任意)

この手順には ソースデータベース(MeDo がホストする Supabase)の接続文字列が必要です。一般ユーザーは通常ソースへの直接アクセス権を持たないため、その場合データを自動的に移行することはできません。アプリを再度操作してデータを生成するか、プラットフォームにエクスポートの支援を依頼するしかありません。新しく作成したアプリにはデータがないので、スキップできます。

ソースデータベースにアクセスできる場合:

# data only, no structure (structure was built in section 6)
pg_dump "<source-DB-URL>" --data-only --no-owner --no-privileges --disable-triggers -Fc -f data.dump
pg_restore --data-only --disable-triggers -d "<target-DB-URL>" data.dump

主要テーブルの select count(*) がソースとターゲットで一致することを確認します。

9. .env を置き換えてローカルで実行する

プロジェクトルートの .env を編集し、URL と anon key を自分のプロジェクトの値(セクション 5 で集めたもの)に入れ替えます。変数のプレフィックスはフレームワークによって異なるので、.env にある既存の名前を確認してください。

# Vite:  VITE_SUPABASE_URL / VITE_SUPABASE_ANON_KEY  (or VITE_APP_SUPABASE_*)
# Taro:  TARO_APP_SUPABASE_URL / TARO_APP_SUPABASE_ANON_KEY
# Expo:  EXPO_PUBLIC_SUPABASE_URL / EXPO_PUBLIC_SUPABASE_ANON_KEY

編集後の .env はおおむね次のようになります。

VITE_APP_ID=app-xxxxxxxx
VITE_SUPABASE_URL=https://<your-ref>.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbG...(your own project's anon key)

依存関係をインストールし、開発サーバーを起動します。

# install deps (use pnpm if the project has pnpm-workspace.yaml, else npm i)
npm i -g pnpm && pnpm install     # or npm install

# start the dev server
npx vite --host 127.0.0.1

注意: npm run dev は使わないでください。MeDo は package.json の dev と build スクリプトをプレースホルダーの echo に置き換えているため、何も起こりません。代わりに npx vite を使います。

ターミナルに表示されたアドレス(たとえば http://127.0.0.1:5173/)を開くと、ランディングページが表示されるはずです。

localhost で動作している MeDo アプリのランディングページ

メール確認を無効にする

新しい Supabase プロジェクトでは既定でメール確認が有効なため、サインアップ後にログインするには確認メールが必要になります。ローカルテストでは先に無効にします。コンソールで Authentication → Sign In / Providers → Email に移動し、Confirm email をオフにして保存します。

注意: 確認の無効化(および下記の admin API のショートカット)はローカルテスト専用です。本番に移る前に Confirm email を再びオンにして、実際のユーザーがメールアドレスを確認するようにしてください。

Free プランにはメール送信のレート制限もあります。確認を無効にしても email rate limit exceeded が出る場合は、service key を使って admin API 経由で確認済みのユーザーを作成します。

curl "https://<ref>.supabase.co/auth/v1/admin/users" \
  -H "apikey: <service_key>" -H "Authorization: Bearer <service_key>" \
  -H "Content-Type: application/json" \
  -d '{"email":"user@example.com","password":"Passw0rd!","email_confirm":true}'

データが自分のデータベースに保存されることを確認する

アプリでサインアップまたはログインしてレコードを作成し、データベースに問い合わせます。

psql "$DBURL" -tc "select email from auth.users;"          # the registered user
psql "$DBURL" -tc "select username from public.profiles;"  # profile auto-created by trigger
psql "$DBURL" -tc "select name from public.projects;"      # business data you created in the app

ログイン後はワークスペースに入り、データは自分の Supabase から取得されます。

ログイン後の MeDo アプリのワークスペース。自分の Supabase がバックエンド

3 つのテーブルすべてが対応するレコードを返せば、サインアップ、トリガーによるプロファイル作成、業務データの書き込みという一連の流れが自分の Supabase に到達していることが証明されます。

10. よくある落とし穴

症状原因対処
npm run dev が「Do not use this command」と表示するMeDo が dev スクリプトを無効化しているnpx vite --host 127.0.0.1 を使う
サインアップ後にログインで止まり、データベースにユーザーがいないメール確認が既定で有効Authentication → Providers → Email で Confirm email を無効にする
email rate limit exceeded(429)Free プランのメールレート制限確認を無効にする。それでも止まる場合は admin API で確認済みユーザーを作成する
サインアップエラー「username may only contain letters, digits, underscores」アプリが <username>@domain をメールアドレスとして扱うユーザー名に @ を入れず、英数字のみを使う
プロジェクトを作成できないFree プランはアクティブプロジェクト最大 2 つ既存のプロジェクトを先に一時停止する
command not found: psqllibpq は keg-only で PATH にないexport PATH="/opt/homebrew/opt/libpq/bin:$PATH"
スキーマのインポートで auth. や storage. の競合が報告される新規でないデータベースにインポートしている新規プロジェクトにインポートする。MeDo の schema.sql は防御的で、新規データベースでは競合しない

11. 移行チェックリスト

  • ツールの準備:supabase、psql、node 20 以降
  • ソースをダウンロードして解凍し、supabase/schema.sql があることを確認
  • 自分の Supabase プロジェクトを作成し、データベースパスワードを保存
  • 4 つの認証情報を集める:URL、anon key、データベース接続文字列、service key
  • psql -f supabase/schema.sql を実行し、テーブル、RLS、トリガーを確認
  • 関数があればデプロイしてシークレットを設定(なければスキップ)
  • データが必要なら移行(ソースデータベースにアクセスできる場合のみ。できなければスキップ)
  • .env の URL と anon key を置き換える
  • Confirm email を無効にする
  • pnpm install と npx vite を実行し、サインアップ、ログイン、データ作成を行う
  • データベースに問い合わせて、データが自分の Supabase に保存されることを確認