• 繁體中文(香港)
  • 匯出與自行託管

    把你的應用程式帶離平台:下載原始碼、在本機運行,並把後端遷移到你自己的 Supabase 專案。

    更新於 2026-09-14

    你的應用程式不會被鎖定在 MeDo。你可以下載完整原始碼,在自己的基礎設施上運行。

    甚麼時候需要這樣做

    • 出於合規或公司政策,你需要在自己的伺服器上託管。
    • 有開發者接手專案,希望放進自己的程式碼庫。
    • 你想在平台生成的基礎上繼續開發。
    • 你要把專案交給希望擁有一切的客戶。

    如果以上都不適用,留在 MeDo 更簡單:託管、後端和更新都由平台代你處理。

    成本與所需投入

    每次下載需要 300 積分。除此之外,自行託管意味着你要接手 MeDo 原本負責的部分:準備資料庫、部署函式、管理密鑰,以及託管前端。首次遷移請預留一小時,並預期需要使用終端機。

    注意: 如果你的應用程式是純前端、沒有儲存資料,只需完成第 1 至 4 節,然後按第 9 節在本機運行即可。如果應用程式會儲存資料,請走完整個流程,在自己的 Supabase 專案上重建結構。

    1. 下載內容包含與不包含甚麼

    你從 Download Code(下載程式碼) 取得的 ZIP 包含後端的結構與函式程式碼——不含資料、不含檔案、不含密鑰。這決定了遷移需要做哪些事。

    內容是否在套件內位置
    前端原始碼(Vite + TS + React)是src/
    資料表結構 / RLS 政策 / 資料庫函式 / 觸發器是supabase/schema.sql
    原始遷移腳本是supabase/migrations/
    Edge Functions 程式碼是(如有)supabase/functions/**/*.ts
    .env(Supabase URL + anon key)是專案根目錄 .env
    資料表中的行資料否必須從來源資料庫匯出(大多數使用者無法存取,見第 8 節)
    Storage 中的檔案否必須另行遷移
    Edge Function secrets否必須在你自己的專案中重新設定
    service_role key否已被平台移除,請使用你自己的

    注意: .env 中的 URL 和 anon key 指向 MeDo 託管的後端。如果不替換,你的本機應用程式仍會連到平台,而不是你自己的資料庫。遷移的核心就是「重建結構,然後換掉這兩個值」。

    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 編輯程式碼。要運行和遷移應用程式,你需要三個工具: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)。

    確認三者都能輸出版本號:

    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 或電郵註冊(免費)。Free 方案足以遷移一個 MeDo 應用程式。

    免費配額上限一個應用程式的用量
    資料庫大小500 MB約 27 MB
    檔案儲存空間1 GB除非你上載檔案,否則為 0
    每月活躍使用者50,000視應用程式而定
    同時活躍的專案數21

    顯示 Free 方案配額的 Supabase 組織首頁

    注意: Free 方案最多同時允許 2 個活躍專案。如果你已有 2 個,請先暫停其中一個,否則無法建立新專案。

    建立專案

    在組織首頁點擊 New project 並填寫:

    • Project name,例如 taskflow-migrate
    • Database password:點擊 Generate a password 生成強密碼,並務必複製保存(匯入 schema 時需要;遺失的話只能重設)
    • Region:選擇離你的使用者最近的區域

    Supabase New project 表單,包含名稱、密碼和區域欄位

    點擊 Create new project,等待一至兩分鐘完成佈建。

    Supabase 專案佈建進行中

    收集四個憑證

    前往 Project Settings,記下以下內容。後續每一步都會用到。

    憑證位置用途
    Project URL(https://<ref>.supabase.co)Settings → Data API寫回 .env
    anon / publishable keySettings → API Keys寫回 .env
    資料庫連接字串 / 密碼Settings → Database(加上上一步的密碼)匯入 schema
    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 包裹的 storage 政策、帶 ON CONFLICT DO UPDATE 的 bucket),所以匯入全新專案時不會產生衝突。

    如果沒有 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 並設定 Secrets

    先檢查套件中是否有函式:

    ls supabase/functions/ 2>/dev/null

    如果沒有函式(許多應用程式只用 anon 加 RLS,沒有伺服器端函式),跳過本節。

    如果有函式,部署它們並重新設定 secrets:

    # 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>

    注意: 函式的 secrets 不在原始碼套件中,必須手動重新設定:第三方 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 支援

    三個資料表都返回對應的記錄,證明整條鏈路——註冊、由觸發器建立的 profile、業務寫入——都落到了你自己的 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"
    Schema 匯入報告 auth. 或 storage. 衝突匯入到了非全新的資料庫匯入全新專案;MeDo 的 schema.sql 是防禦性的,在全新資料庫上不會衝突

    11. 遷移檢查清單

    • 工具就緒:supabase、psql、node 20 或更新版本
    • 下載並解壓原始碼,確認 supabase/schema.sql 存在
    • 建立你自己的 Supabase 專案,保存資料庫密碼
    • 收集四個憑證:URL、anon key、資料庫連接字串、service key
    • 執行 psql -f supabase/schema.sql,驗證資料表、RLS 和觸發器
    • 如有函式,部署並設定 secrets(否則跳過)
    • 如需資料,進行遷移(僅在能連到來源資料庫時,否則跳過)
    • 替換 .env 中的 URL 和 anon key
    • 停用 Confirm email
    • 執行 pnpm install 和 npx vite,然後註冊、登入並建立資料
    • 查詢資料庫,確認資料落到你自己的 Supabase