• 繁體中文(香港)
  • 下載及建置應用程式

    MeDo 的專案程式碼匯出功能可讓你下載應用程式原始碼、在本機運行,並在有後端時把後端遷移至你自己的 Supabase 專案。每次下載需消耗 300 點數。

    注意: 若你的應用程式為純前端(無後端資料),只需第 1 至 4 節,然後在第 9 節於本機運行。若使用後端資料儲存,請依完整流程在你自己的 Supabase 上重建結構。

    1. 下載包裡有什麼、沒有什麼

    透過下載程式碼取得的 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 密鑰須在你自己的專案重新設定
    service_role 密鑰平台已抹除,須改用你自己的

    注意: .env 內的 URL 與 anon key 指向 MeDo 託管的後端。若不替換,你本機的應用程式仍會連線至平台,而非你自己的資料庫。遷移的核心就是「重建結構,再替換這兩個值」。

    2. 如何下載應用程式程式碼?

    應用程式成功生成後,編輯介面上方會出現「下載」按鈕。只需點擊此按鈕,即可下載應用程式的程式碼包。請注意,應用程式生成過程中無法下載程式碼。下載為 Pro 用戶專屬功能。

    MeDo 編輯器頂欄的下載程式碼按鈕

    下載的程式碼版本會對應開發者目前正在編輯的特定應用程式版本。

    如果在開發過程中使用編輯器進行了任何 GUI 修改(例如編輯字體、顏色等),下載程式碼前必須先預覽或發佈應用程式。這可確保下載的程式碼包包含所有 GUI 修改。

    GUI 修改後下載提示範例

    3. 解壓原始碼

    解壓下載的程式碼包並進入目錄:

    cd ~/Downloads
    unzip -o your-app.zip -d your-app
    cd your-app/app-xxxxxxxx        # 進入包含 package.json 的資料夾
    
    # 確認結構
    ls -la                          # 應顯示 package.json、src/、supabase/、.env
    ls -la supabase/
    test -f supabase/schema.sql && echo "有 schema.sql(全量匯入)" || echo "沒有 schema.sql(改用 migrations)"

    典型結構如下:

    app-xxxxxxxx/
    ├── .env                    # VITE_SUPABASE_URL / VITE_SUPABASE_ANON_KEY
    ├── package.json
    ├── src/                    # 前端原始碼
    │   └── db/supabase.ts      # createClient(url, anonKey)
    └── supabase/
        ├── config.toml
        ├── migrations/         # 原始遷移腳本
        └── schema.sql          # 完整結構:資料表、RLS、函式、觸發器、storage bucket

    注意:schema.sql 存在,就用它(第 5 節,全量匯入)。若不存在,執行 supabase db push 套用遷移。

    4. 準備工具

    你可以使用 VSCodeIntelliJ IDEA 或任何偏好的 IDE 編輯程式碼。要運行並遷移應用程式,你需要三項工具:Node.js 20 或以上Supabase CLI,以及 psql(Postgres 用戶端)。

    在 macOS 上使用 Homebrew:

    brew install node                    # Node.js 20+(或用 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 CLIscoop install supabase),以及 PostgreSQL(內含 psql)。下文指令完全相同;只有 export PATH=... 那行是 macOS 專用。

    在 Linux 上,從發行版二進位檔安裝 Supabase CLI、透過套件管理員安裝 psql(例如 sudo apt install postgresql-client),並安裝 Node 20 或以上。

    確認三者都能印出版本:

    node -v && npm -v      # node 20 或以上
    supabase --version     # 例如 2.109.1
    psql --version         # 例如 psql (PostgreSQL) 18.4

    注意: 若你的應用程式為純前端、無後端,直接跳到第 9 節於本機運行。Supabase 步驟(5 至 8)只適用於有後端資料儲存的應用程式。

    5. 建立你自己的 Supabase 專案

    若你還沒有 Supabase 帳戶

    前往 https://supabase.com,點擊 Start your project,用 GitHub 或電子郵件註冊(免費)。免費方案足以遷移一個 MeDo 應用程式。

    免費額度上限單一應用程式用量
    資料庫大小500 MB約 27 MB
    檔案儲存1 GB除非上傳檔案,否則為 0
    每月活躍用戶50,000視應用程式而定
    同時活躍專案21

    Supabase 組織首頁顯示免費方案額度

    注意: 免費方案最多同時 2 個活躍專案。若已有 2 個,須先暫停其中一個,否則無法新建。

    建立專案

    在組織首頁點擊 New project,填入:

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

    Supabase 新專案表單,含名稱、密碼與區域欄位

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

    Supabase 專案佈建進行中

    收集四項憑據

    進入 Project Settings 並記錄以下項目,後續每一步都會用到。

    憑據位置用途
    Project URL(https://<ref>.supabase.coSettings → 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:<你的DB密碼>@db.<project-ref>.supabase.co:5432/postgres

    cd ~/Downloads/your-app/app-xxxxxxxx
    export PATH="/opt/homebrew/opt/libpq/bin:$PATH"
    
    # 全量匯入(存在 schema.sql 時)
    psql "postgresql://postgres:<DB密碼>@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 <你的 project-ref>
    supabase db push

    驗證匯入結果

    DBURL="postgresql://postgres:<DB密碼>@db.<ref>.supabase.co:5432/postgres"
    psql "$DBURL" -c "\dt public.*"                                                   # 資料表
    psql "$DBURL" -tc "select count(*) from pg_policies where schemaname='public';"  # RLS 政策數
    psql "$DBURL" -tc "select tgname from pg_trigger where tgrelid='auth.users'::regclass and not tgisinternal;"  # 觸發器

    你也可以直接在 Supabase Table Editor 看到已遷移的資料表。

    Supabase Table Editor 顯示已遷移的資料表

    7. 部署 Edge Functions 並設定密鑰

    先檢查下載包是否含函式:

    ls supabase/functions/ 2>/dev/null

    若沒有函式(許多應用程式純用 anon 加 RLS,無伺服器端函式),可略過本節。

    若有函式,部署並重新設定其密鑰:

    # 1) 部署所有函式
    supabase functions deploy --project-ref <你的 project-ref>
    # 或逐個部署:supabase functions deploy <function-name>
    
    # 2) 找出函式使用了哪些密鑰(原始碼中的 Deno.env.get)
    grep -rhoE "Deno\.env\.get\(['\"][^'\"]+['\"]\)" supabase/functions | sort -u
    
    # 3) 逐個設定(值取自你自己的服務)
    supabase secrets set MY_API_KEY=xxxx --project-ref <你的 project-ref>
    supabase secrets list --project-ref <你的 project-ref>

    注意: 函式密鑰不在下載包內,須手動重新設定:第三方 API 密鑰,以及函式內引用的任何 SUPABASE_SERVICE_ROLE_KEY

    8. 遷移資料(選用)

    此步驟需要來源資料庫(MeDo 託管的 Supabase)的連線字串。一般用戶通常無法直接存取來源,此時資料無法自動遷移——你只能重新運行應用程式產生資料,或請平台協助匯出。全新建立的應用程式沒有資料,可略過此步。

    若你能連上來源資料庫:

    # 只匯出資料,不含結構(結構已在第 6 節建立)
    pg_dump "<來源-DB-URL>" --data-only --no-owner --no-privileges --disable-triggers -Fc -f data.dump
    pg_restore --data-only --disable-triggers -d "<目標-DB-URL>" data.dump

    驗證來源與目標核心資料表的 select count(*) 是否一致。

    9. 替換 .env 並在本機運行

    編輯專案根目錄的 .env,把 URL 與 anon key 換成你自己專案的值(第 5 節收集的)。變數前綴取決於框架,請對照你 .env 中既有的名稱:

    # Vite:  VITE_SUPABASE_URL / VITE_SUPABASE_ANON_KEY  (或 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://<你的-ref>.supabase.co
    VITE_SUPABASE_ANON_KEY=eyJhbG...(你自己專案的 anon key)

    安裝相依套件並啟動開發伺服器:

    # 安裝相依套件(若專案有 pnpm-workspace.yaml 則用 pnpm,否則用 npm i)
    npm i -g pnpm && pnpm install     # 或 npm install
    
    # 啟動開發伺服器
    npx vite --host 127.0.0.1

    注意: 請勿使用 npm run dev。MeDo 已把 package.json 中的 devbuild 腳本替換成佔位用的 echo,執行它們不會有任何作用。請改用 npx vite

    開啟終端機顯示的位址(例如 http://127.0.0.1:5173/);著陸頁應正常呈現。

    在 localhost 運行的 MeDo 應用程式著陸頁

    停用電子郵件確認

    全新的 Supabase 專案預設啟用電子郵件確認,因此註冊後需要收到確認郵件才能登入。在本機測試時,先停用它:在控制台進入 Authentication → Sign In / Providers → Email,關閉 Confirm email 並儲存。

    注意: 停用確認(以及下方的 admin API 捷徑)僅供本機測試。正式上線前,請重新開啟 Confirm email,讓真實用戶驗證其電子郵件。

    免費方案還有電子郵件寄送速率限制。若停用確認後仍遇到 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;"          # 已註冊的用戶
    psql "$DBURL" -tc "select username from public.profiles;"  # 由觸發器自動建立的 profile
    psql "$DBURL" -tc "select name from public.projects;"      # 你在應用程式中建立的業務資料

    登入後你會進入工作區,資料來自你自己的 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)免費方案電子郵件速率限制停用確認;若仍卡住,用 admin API 建立已預先確認的用戶
    註冊錯誤「username may only contain letters, digits, underscores」應用程式把 <username>@domain 當成電子郵件username 不要含 @,用純英數字元
    無法建立專案免費方案最多 2 個活躍專案先暫停一個既有專案
    command not found: psqllibpq 為 keg-only,未在 PATHexport PATH="/opt/homebrew/opt/libpq/bin:$PATH"
    schema 匯入報 auth.storage. 衝突匯入到非全新的資料庫匯入全新專案;MeDo 的 schema.sql 採防禦式語法,在全新資料庫上不會衝突

    11. 遷移檢查清單

    • 工具就緒:supabasepsqlnode 20 或以上
    • 下載並解壓原始碼,確認 supabase/schema.sql 存在
    • 建立你自己的 Supabase 專案,保存資料庫密碼
    • 收集四項憑據:URL、anon key、資料庫連線字串、service key
    • 執行 psql -f supabase/schema.sql,驗證資料表、RLS 與觸發器
    • 若有函式,部署並設定密鑰(否則略過)
    • 若需要資料,進行遷移(僅在能連上來源資料庫時,否則略過)
    • 替換 .env 中的 URL 與 anon key
    • 停用 Confirm email
    • 執行 pnpm installnpx vite,然後註冊、登入、建立資料
    • 查詢資料庫,確認資料命中你自己的 Supabase