「ノーコードでサクっと作った勤怠アプリを、ちゃんとした DB(Supabase)に載せ替えたい」
というところまで一気通貫でやった記録です。
- UI: Lovable
- ソース管理: GitHub
- DB(初期): Lovable Cloud
- DB(最終): Supabase(PostgreSQL)
- 動作確認: ローカル
npm run dev(Vite)
全体の流れ
- Lovable で勤怠管理アプリを新規作成
- 要件定義どおりに Cloud DB で動かしてみる
- GitHub と連携してソースを管理
- Supabase に新しい Project を作成
- Supabase 向けの
.envを用意 - Supabase の SQL Editor で migration を流してスキーマ作成
- Lovable Cloud 側のデータを CSV で出して Supabase にインポート
- ローカルで
npm run dev→ Supabase 接続で動作確認 - Supabase Auth の URL / Email 設定を調整
- 自分のユーザーに admin 権限を付与 → 管理者ページの表示を確認
1. 勤怠管理アプリの要件定義(Lovable 側)
Lovable に渡した要件定義はざっくり以下。
機能要件(抜粋)
- Google ログイン / メール+パスワードログイン
- 初回ログイン時オンボーディング
- 氏名 / 社員番号 / 部署
- 打刻
- 出勤ボタン(1タップ)
- 退勤ボタン(1タップ)
- 当日のステータス表示(未出勤 / 出勤済 / 退勤済)
- 勤怠ステータス
- 遅刻 / 早退 / 休暇 / テレワーク / 残業
- 個人向け画面
- 日別一覧
- 月次集計(勤務時間・残業時間)
- 所定労働時間は 9:00〜17:30(7.5h)
- 管理者向けダッシュボード
- 全社員の一覧
- 月次サマリー(遅刻回数・休暇回数など)
- CSV エクスポート
データ構造(概念)
-
users/profiles/user_roles的なユーザ関連 -
attendance勤怠記録 - 勤務時間・残業時間はトリガーで自動計算
これを Lovable に投げると、画面&Cloud DB スキーマまで一式作ってくれる。
2. Lovable でアプリ作成 + 動作確認
ここは Lovable 側のウィザードに従って進めただけ。
- Lovable で新規プロジェクトを作成
- さっきの要件をプロンプトに貼る
- 自動生成された画面をいくつか修正
- 内蔵プレビューで Cloud DB を使ってログイン〜打刻まで動作確認
この時点では DB は Lovable Cloud のまま。
3. GitHub と連携してリポジトリ作成
Lovable の UI から GitHub 連携を有効化。
- 左メニュー → Integrations → GitHub
- GitHub の OAuth を許可
- Workspace と GitHub アカウントの紐付け
- プロジェクト側の設定で
seiya-sugimoto/attendanceAppというリポジトリ名で接続
Lovable 側の GitHub パネルはこんな感じの状態になる:
-
seiya-sugimoto/attendanceAppと表示 -
View on GitHubボタンでリポジトリを開ける - CLI 用に
gh repo clone seiya-sugimoto/attendanceAppのコマンドが出る
これで ソースコードをローカルに clone できる状態 になった。
4. Supabase プロジェクトの作成
次に DB を Supabase に移す。
- https://supabase.com に GitHub アカウントで Sign in
- New organization(例:
seiya's Org) - New project を作成
- Project name:
attendanceApp - Database password: 強いパスワードを設定
- Region:
Asia-Pacificを選択(日本から近い)
- Project name:
- 数十秒待つと PostgreSQL インスタンスが立ち上がる
Project Settings → General から以下を確認しておく:
- Project name
- Project ID(あとで使うこともある)
5. Supabase 用の .env を用意する
GitHub からローカルに clone して開く:
gh repo clone seiya-sugimoto/attendanceApp
cd attendanceApp
Lovable が自動で .env を作ってくれている場合があるので、まず中身確認。
なければ自分で作る。
Supabase のダッシュボード → Project Settings → API から以下を取得:
-
Project URL(例:https://xxxx.supabase.co) -
anon publickey
.env には Vite 用のプレフィックス付きで書く(ここ重要):
VITE_SUPABASE_URL=https://xxxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbGciOiJI...
※ 私のプロジェクトではすでに .env が存在していたので、
中身だけ Supabase 用の値に書き換えた。
6. Supabase にスキーマを流し込む(migration 実行)
Lovable が生成したリポジトリには、
supabase/migrations/ ディレクトリがあり、SQL が何本か入っている。
例:
supabase/migrations/
20241208_init.sql
20241208_user_profiles_roles.sql
20241208_attendance_tables.sql
これらを 古いファイルから順番に Supabase の SQL Editor で実行する。
手順
- Supabase ダッシュボード → 左メニュー SQL Editor
- 「New query」を開く
- 1本目の migration ファイルの中身をコピペ
-
Runボタンを押す- 成功すると
Success. No rows returnedと出る
→ テーブル・関数・トリガーが正常に作成された合図
- 成功すると
- 2本目以降も同様に、昇順で 実行する
途中でこんなエラーが出たら:
ERROR: relation "attendance" already exists
→ そのテーブルはもう作られているので、その SQL はスキップして次へ。
実行後、Table Editor を開くと以下のようなテーブルが見えるはず:
attendance-
attendance-lovablecloud(元DBからの一時テーブル) profilesuser_roles- そのほか補助テーブル
これで Supabase 上に Lovable と同じスキーマが再現された。
7. Lovable Cloud → Supabase へデータをインポート
スキーマだけでは空の DB なので、
必要なら Lovable Cloud 側のデータを CSV で持ってきて Supabase に流す。
よくハマるポイント
Supabase の Table Editor で
New table から CSV をインポートしようとすると、
既に attendance テーブルがあるのでエラーになる。
ERROR: 42P07: relation "attendance" already exists
やるべきは「新規テーブルを作る」のではなく、既存テーブルにインポートすること。
正しい Import 手順
- Supabase → Table Editor
- 対象テーブル(例:
attendance)をクリック - 右上の Import data(CSV インポート)を選択
- Lovable Cloud からエクスポートした CSV を選ぶ
- カラム対応を確認して Import
同様に、必要なら profiles や user_roles も同じ手順で移行する。
8. ローカルで npm run dev して Supabase に繋がるか確認
ここまでで
-
.envに Supabase 情報 - Supabase にテーブル・データあり
という状態になったので、ローカルでアプリを起動する。
npm install # 初回だけ
npm run dev
出力例:
VITE v5.4.19 ready in 515 ms
➜ Local: http://localhost:8080/
➜ Network: http://192.168.0.72:8080/
ブラウザで http://localhost:8080/ を開くと、
Lovable で作った勤怠管理アプリが Supabase バックエンドで動く。
9. Supabase Auth の設定(URL / Redirect)
最初ここでログインがうまくいかなかった。
原因は Supabase 側の URL 設定がデフォルトのまま だったこと。
デフォルトだと:
- Site URL:
http://localhost:3000 - Redirect URLs: 空
となっており、アプリは http://localhost:8080 で動いているので不整合が起きる。
設定手順
Supabase → Authentication → URL Configuration
-
Site URL
http://localhost:8080 -
Redirect URLs
http://localhost:8080 http://localhost:8080/* http://localhost:8080/auth/callback
「Save changes」を押して保存。
これで、
ログインフローで Supabase がユーザーをアプリに戻す先がきちんと定義される。
10. 「Email not confirmed」問題の解消
URL を直しても、ログイン時に右下にこんなエラーが出た。
Email not confirmed
Supabase はデフォルトで メールアドレスの確認(Email Confirmation)必須 になっている。
開発中の勤怠アプリでは、
そこまで厳密にしたくなかったので メール確認を OFF にした。
設定手順
- Supabase → Authentication → Providers → Email
もしくは Policies / Settings のメール関連設定 - 「Email confirmation required」 系のチェックを OFF にする
また、すでに作ってしまったユーザーについては
SQL で強制的に確認済みにしておくこともできる:
update auth.users
set email_confirmed_at = now()
where email = 'sugimoto@sawada5681.jp';
いずれにせよ、
Email confirmation を OFF にしたらログインが通るようになった。
11. admin ロールを付与して管理者ページを開けるようにする
ログインに成功しても、最初は一般ユーザー扱いなので
管理者ページにはアクセスできない。
このアプリでは、権限は user_roles テーブルで管理されていた。
user_roles の構造例:
| column | type | 説明 |
|---|---|---|
| id | uuid | 主キー |
| user_id | uuid | auth.users.id |
| role | text |
user or admin
|
| created_at | timestamptz | 作成日時 |
Supabase の Table Editor から手動で admin に変更
- Supabase → Table Editor → user_roles
- 自分の
user_id行を確認- auth.users の
idと紐づいている
- auth.users の
-
roleカラムをadminに上書き保存
もしくは SQL でやるなら:
update public.user_roles
set role = 'admin'
where user_id = '(自分の user_id)';
これで再ログインすると、
管理者ページにアクセスできるようになる。
実際、
管理者ページに入れた時点で Supabase 移行はほぼ完了。
12. ここまででできたことの整理
- Lovable で勤怠管理アプリを作成
- GitHub 連携でソース管理
- Supabase に新しい Project を用意
- Lovable が生成した migration を使って Supabase にテーブル定義を構築
- Lovable Cloud 側のデータを CSV 経由で Supabase にインポート
-
.envで Supabase の URL / ANON_KEY を設定 -
npm run devで Supabase バックエンドのローカル動作確認 - Supabase Auth の URL / Redirect / Email 設定を調整してログイン成功
-
user_rolesテーブルで role=admin を付けて管理者画面を表示
13. この先やると良さそうなこと(メモ)
Qiita 記事としてはここまでで一段落だけど、
実運用を考えると次のあたりが拡張ポイントになりそう。
- RLS(Row Level Security) のポリシーを調整
- 一般ユーザー: 自分の
attendanceだけ見れる - 管理者: 全員分を見れる
- 一般ユーザー: 自分の
- 有給残数の管理カラム追加
- 月次締め処理(集計テーブル or ビュー)
- Supabase Functions / Edge Functions を使った集計バッチ
- 本番デプロイ用の URL を Supabase Auth の Redirect に追加
-
.envの管理方法(GitHub 上での Secret 管理など)の整理
まとめ
Lovable で UI 〜画面遷移までを一気に作りつつ、
DB は Supabase に寄せていく、というハイブリッド構成はかなり良い手触りだった。
チューニングの肝はこの3つ
- migration を Supabase SQL Editor に順に流していくこと
- Auth の URL / Email 設定をちゃんと合わせること
- user_roles 等で権限を明示すること
ここをクリアすれば、
「ノーコードで作った試作品」を
「ちゃんとした Postgres バックエンドを持つアプリ」に
スムーズに昇格させられる。


