Supabaseセットアップガイド

数分で自分専用のクラウドデータベースを設定できます。あなたのデータ、あなたの管理。

なぜセルフホステッドクラウドなのか

あなたのデータ

GPSデータはあなた自身のデータベースに保存されます。私たちがアクセスすることはありません。

ベンダーロックインなし

Supabaseはオープンソースです。いつでもデータをエクスポートでき、自由にプロバイダーを変更できます。

追加費用なし

Supabaseの無料枠で個人利用は十分。クラウド解放の買い切り以外に月額料金はかかりません。

始める前に

JizaiLogアプリのインストールと無料アカウントの作成が必要です。クラウド同期はアプリ内課金(¥1,500・買い切り)で利用できます。

1

Supabaseプロジェクトを作成

  1. supabase.comにアクセスし、無料アカウントを作成します。
  2. 「New Project」をクリックし、名前を付けます(例:「jizailog-gps」)。
  3. レイテンシーを最小にするため、最も近いリージョンを選択します。
  4. 安全なデータベースパスワードを設定します(アプリには入力不要です)。
  5. プロジェクトの初期化が完了するまで待ちます(通常1分以内)。
Supabase — 新しい組織を作成Supabase — 新規プロジェクト設定
2

データベーススキーマを実行

  1. Supabaseダッシュボードの左サイドバーからSQL Editorに移動します。
  2. 「New query」をクリックします。
  3. 以下のSQL全体をコピーしてエディターに貼り付けます。
  4. 「Run」をクリックします(またはCtrl+Enterを押します)。
  5. 「Success. No rows returned」と表示されれば、全テーブルが作成されています。
データベーススキーマSQL
-- =============================================
-- JizaiLog GPS Database Schema
-- Run this in YOUR Supabase SQL Editor
-- =============================================

-- run_sql() — allows worker to auto-migrate via rpc()
CREATE OR REPLACE FUNCTION run_sql(query text) RETURNS void
LANGUAGE plpgsql SECURITY DEFINER AS $
BEGIN EXECUTE query; END;
$;

REVOKE ALL ON FUNCTION run_sql(text) FROM PUBLIC;
REVOKE ALL ON FUNCTION run_sql(text) FROM anon;
GRANT EXECUTE ON FUNCTION run_sql(text) TO service_role;

-- Schema version tracking
CREATE TABLE schema_version (
    version     INTEGER NOT NULL PRIMARY KEY,
    name        TEXT NOT NULL,
    applied_at  TEXT NOT NULL
);

INSERT INTO schema_version VALUES (1, 'baseline', NOW()::TEXT);

-- Sessions — one row per recorded walk
CREATE TABLE sessions (
    id            UUID PRIMARY KEY,
    user_id       UUID NOT NULL,
    status        TEXT NOT NULL DEFAULT 'stopped',
    started_at    TIMESTAMPTZ NOT NULL,
    ended_at      TIMESTAMPTZ,
    point_count   INTEGER DEFAULT 0,
    discard_count INTEGER DEFAULT 0,
    distance_m    REAL DEFAULT 0,
    duration_s    INTEGER DEFAULT 0,
    created_at    TIMESTAMPTZ DEFAULT now()
);

CREATE INDEX idx_sessions_user ON sessions(user_id);

-- Points — raw GPS coordinates per session
CREATE TABLE points (
    id         UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
    ts         BIGINT NOT NULL,
    lat        DOUBLE PRECISION NOT NULL,
    lng        DOUBLE PRECISION NOT NULL,
    alt        DOUBLE PRECISION,
    accuracy   REAL,
    speed      REAL,
    heading    REAL,
    UNIQUE(session_id, ts)
);

CREATE INDEX idx_points_session_ts ON points(session_id, ts);

-- Device debug logs
CREATE TABLE device_logs (
    id          BIGSERIAL PRIMARY KEY,
    user_id     UUID NOT NULL,
    device_id   TEXT NOT NULL,
    platform    TEXT NOT NULL,
    ts          BIGINT NOT NULL,
    tag         TEXT NOT NULL,
    message     TEXT NOT NULL,
    app_version TEXT,
    created_at  TIMESTAMPTZ DEFAULT now()
);

CREATE INDEX idx_device_logs_user_ts ON device_logs(user_id, ts DESC);
CREATE INDEX idx_device_logs_device ON device_logs(device_id, ts DESC);

-- Session comments (chat)
CREATE TABLE session_comments (
    id          UUID PRIMARY KEY,
    session_id  UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
    user_id     UUID NOT NULL,
    content     TEXT,
    image_path  TEXT,
    created_at  BIGINT NOT NULL
);

CREATE INDEX idx_comments_session ON session_comments(session_id, created_at);

-- Comment read tracking
CREATE TABLE comment_reads (
    session_id   UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
    user_id      UUID NOT NULL,
    last_read_at BIGINT NOT NULL,
    PRIMARY KEY (session_id, user_id)
);

-- Per-session sharing
CREATE TABLE session_access (
    session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
    user_id    UUID NOT NULL,
    granted_by UUID NOT NULL,
    created_at TIMESTAMPTZ DEFAULT now(),
    PRIMARY KEY (session_id, user_id)
);

CREATE INDEX idx_session_access_user ON session_access(user_id);

-- Enable Row Level Security on all tables
ALTER TABLE schema_version ENABLE ROW LEVEL SECURITY;
ALTER TABLE sessions ENABLE ROW LEVEL SECURITY;
ALTER TABLE points ENABLE ROW LEVEL SECURITY;
ALTER TABLE device_logs ENABLE ROW LEVEL SECURITY;
ALTER TABLE session_comments ENABLE ROW LEVEL SECURITY;
ALTER TABLE comment_reads ENABLE ROW LEVEL SECURITY;
ALTER TABLE session_access ENABLE ROW LEVEL SECURITY;

-- No anon policies or grants needed — Worker uses service_role key
-- which bypasses RLS entirely.

組織管理者の方へ:組織の共有データベースを設定する場合、このSQLを1回だけ実行してください。メンバーは組織に参加するだけで自動的に接続されます。

3

認証情報を取得

  1. SupabaseダッシュボードでSettings > APIに移動します。
  2. Project URLをコピーします(https://xxxxx.supabase.coのような形式)。
  3. service_roleキーをコピーします(「Service Role Key」の下にある、eyJ...で始まる長い文字列)。
Supabase — Project URLとService Role Keyをコピー

重要:service_roleキーはデータベースへのフルアクセス権を持ちます。外部に公開せず、クライアント側コードには絶対に含めないでください。サーバー側で安全に保管されます。

4

JizaiLogで設定

  1. デバイスでJizaiLogアプリを開きます。
  2. 設定 > データベース設定に移動します。
  3. URLフィールドにProject URLを貼り付けます。
  4. キーフィールドにservice_roleキーを貼り付けます。
  5. 保存をタップします。
5

接続を確認

  1. 短いお散歩を記録します(部屋の中を1分歩くだけでOKです)。
  2. 記録を停止します。
  3. ローカルクラウドの両方のタブにセッションが表示されることを確認します。
  4. 両方に表示されていれば、設定完了です!

同期に失敗した場合は、URLとservice_roleキーを再確認してください。最も多い原因は、間違ったキーのコピーです。

コスト

Supabase無料プランの内容:

500 MB

データベースストレージ

1 GB

ファイルストレージ

50K

月間アクティブユーザー

個人使用には十分すぎる容量です。一般的なお散歩セッションの使用量は50 KB未満です。 有料プランは月額$25からですが、ほとんどの個人ユーザーはアップグレードの必要がありません。