diff --git a/README.md b/README.md index 8a856bd..e18de1a 100644 --- a/README.md +++ b/README.md @@ -374,6 +374,8 @@ The master password lookup order is: **macOS Keychain → `MYSH_MASTER_PASSWORD` - [Sharing Connections](docs/sharing-connections.md) — export/import configurations for team onboarding - [Import Guide](docs/import-guide.md) — migrate from DBeaver, Sequel Ace, MySQL Workbench +Japanese translations are available under [`docs/ja/`](docs/ja/)(日本語ドキュメントは [`docs/ja/`](docs/ja/) を参照). + ## Dependencies - `golang.org/x/crypto` - Argon2id key derivation diff --git a/docs/getting-started.ja.md b/docs/ja/getting-started.md similarity index 100% rename from docs/getting-started.ja.md rename to docs/ja/getting-started.md diff --git a/docs/import-guide.ja.md b/docs/ja/import-guide.md similarity index 100% rename from docs/import-guide.ja.md rename to docs/ja/import-guide.md diff --git a/docs/ja/redash-guide.md b/docs/ja/redash-guide.md new file mode 100644 index 0000000..9ed5e14 --- /dev/null +++ b/docs/ja/redash-guide.md @@ -0,0 +1,185 @@ +# Redash連携ガイド + +Redash経由で本番データベースにクエリを投げる方法です。DB認証情報やSSHトンネルは不要で、出力マスキングも自動で適用されます。 + +## 概要 + +``` +あなた / Claude Code → mysh → Redash API → データベース + ↓ + マスキング適用 + ↓ + 安全な結果 +``` + +myshがSQLをRedashに送信し、結果を受け取ってマスキングルールを適用し、サニタイズされた出力を返します。個人情報がAIアシスタントに届くことはありません。 + +## セットアップ + +### 1. Redash APIキーを取得する + +1. Redashにログイン +2. プロフィールアイコン → **Settings** +3. **API Key** をコピー + +### 2. データソースIDを確認する + +エンジニアに聞くか、Redashで以下を確認します。 + +1. **Settings** → **Data Sources** +2. 使いたいデータソースをクリック +3. URLの末尾がID: `https://redash.example.com/data_sources/3` → IDは `3` + +### 3. 接続を追加する + +```bash +mysh add --name prod \ + --redash-url https://redash.example.com \ + --redash-key YOUR_API_KEY \ + --redash-datasource 3 +``` + +対話で以下が聞かれます。 + +- **Environment**: 自動マスキングを有効にするため `production` を選択 +- **Mask columns**: そのままEnterでデフォルト(`email,phone,*password*,*secret*,*token*,*address*`) + +### 4. 動作確認 + +```bash +mysh ping prod +# Connection "prod" (Redash): OK (85ms) +``` + +## 使い方 + +### クエリを実行する + +```bash +# インラインSQL +mysh run prod -e "SELECT * FROM users LIMIT 5" + +# SQLファイルから実行 +mysh run prod query.sql +``` + +### 出力フォーマット + +```bash +# CSV +mysh run prod -e "SELECT * FROM users" --format csv + +# JSON +mysh run prod -e "SELECT * FROM users" --format json + +# Markdownテーブル +mysh run prod -e "SELECT * FROM users" --format markdown + +# ファイルへ保存 +mysh run prod -e "SELECT * FROM users" --format csv -o users.csv +``` + +### Claude Codeと使う + +やりたいことを自然言語で書くだけです。 + +> 「アクティブなサブスクリプションをプラン別に集計して」 + +Claude CodeがSQLを自動生成し、mysh経由で実行してくれます。 + +## マスキング + +直接接続の場合と同じ挙動です。マスクルールに一致したカラムは自動で伏せ字になります。 + +| 種別 | 元の値 | マスク後 | +|------|--------|----------| +| メール | alice@example.com | a\*\*\*@example.com | +| 電話番号 | 090-1234-5678 | 0\*\*\* | +| 氏名 | Alice | A\*\*\* | + +production接続では、端末から実行しようとスクリプトから実行しようとAIアシスタントから実行しようと、常にマスキングが適用されます。 + +## ノンインタラクティブセットアップ + +スクリプトや自動化(新メンバーのプロビジョニング等)向けに、対話を飛ばせます。 + +```bash +export MYSH_MASTER_PASSWORD="the-master-password" + +mysh add --name prod \ + --redash-url https://redash.example.com \ + --redash-key "$REDASH_API_KEY" \ + --redash-datasource 3 \ + --env production \ + --mask "email,phone,*password*,*secret*,*token*,*address*" +``` + +## 複数データソース + +用途別に複数のRedash接続を登録できます。 + +```bash +mysh add --name analytics \ + --redash-url https://redash.example.com \ + --redash-key YOUR_KEY \ + --redash-datasource 5 \ + --env production \ + --mask "email,phone" + +mysh add --name logs \ + --redash-url https://redash.example.com \ + --redash-key YOUR_KEY \ + --redash-datasource 8 \ + --env staging +``` + +```bash +mysh run analytics -e "SELECT count(*) FROM events WHERE date = CURDATE()" +mysh run logs -e "SELECT * FROM access_logs LIMIT 10" +``` + +## 接続設定の共有 + +エンジニアはRedash接続をチームに配布できます。 + +```bash +# エクスポート(APIキーは除外される) +mysh export prod > prod-redash.yaml + +# 受け取り側は自分のAPIキーを入れてインポート +mysh import --from yaml --file prod-redash.yaml +``` + +## トラブルシューティング + +### `redash API returned HTTP 403` + +- APIキーが無効・期限切れ、または該当データソースへの権限がない +- Redashのプロフィール設定から新しいAPIキーを発行する + +### `redash API returned HTTP 400` + +- SQLのシンタックスエラー +- データソースIDが間違っている + +### `redash API request failed: connection refused` + +- Redash URLを確認 +- 社内VPN接続が必要な場合もある + +### `redash query failed: ...` + +- Redashはクエリを実行したが失敗している(テーブルが存在しない、権限不足など) +- エラーメッセージで詳細を確認 + +### クエリに時間がかかる + +- Redash側にクエリタイムアウト(通常5分)がある +- myshはRedashのジョブ完了を500msごとにポーリングしながら待機 +- 大きなクエリには `LIMIT` を付けることを検討 + +### マスクしたいカラムがマスクされない + +- `mysh edit prod` でマスク設定を確認 +- カラム名は大文字小文字を区別せず比較される +- パターンはワイルドカードをサポート: `*address*` は `home_address`, `email_address` などにマッチ diff --git a/docs/ja/sharing-connections.md b/docs/ja/sharing-connections.md new file mode 100644 index 0000000..ecdd0b7 --- /dev/null +++ b/docs/ja/sharing-connections.md @@ -0,0 +1,137 @@ +# 接続設定の共有 + +myshの接続設定をエクスポート・インポートして、チームメンバーのセットアップを簡単にする方法です。 + +## 概要 + +エンジニアが一度接続設定を作って、チームに配布します。受け取る側は自分の認証情報を入力するだけで、それ以外の設定(environment、SSH、マスキングルール)はそのまま引き継がれます。 + +``` +エンジニア チームメンバー +────────── ────────── +mysh export prod > prod.yaml → mysh import --from yaml --file prod.yaml + → パスワード入力 + → 完了 +``` + +## エクスポート + +### 特定の接続をエクスポート + +```bash +mysh export prod > prod.yaml +``` + +### 全接続をエクスポート + +```bash +mysh export > all-connections.yaml +``` + +### 含まれる内容 + +| 項目 | 含まれる | 備考 | +|------|----------|------| +| 接続名 | Yes | | +| Environment | Yes | production, staging, development | +| DBホスト | Yes | | +| DBポート | Yes | | +| DBユーザー | Yes | | +| DB名 | Yes | | +| DBパスワード | **No** | セキュリティのため常に除外 | +| SSH設定 | Yes | host, port, user, key path | +| マスクルール | Yes | columns と patterns | +| Driver | Yes | cli または native | +| Redash URL | Yes | Redash接続の場合 | +| Redash APIキー | **No** | セキュリティのため常に除外 | +| Redashデータソース ID | Yes | Redash接続の場合 | + +### 出力例 + +```yaml +- name: production + env: production + ssh: + host: bastion.example.com + user: deploy + key: ~/.ssh/id_ed25519 + db: + host: 10.0.0.5 + port: 3306 + user: app + database: myapp_production + mask: + columns: + - email + - phone + patterns: + - "*address*" + - "*secret*" +``` + +## インポート + +### YAMLファイルから + +```bash +mysh import --from yaml --file prod.yaml +``` + +インポートフロー: + +1. ファイル内の接続一覧を表示 +2. インポートするものを選択 +3. DBパスワード(またはRedash APIキー)を入力 +4. 接続テスト +5. 設定を保存 + +### 全部まとめて一気にインポート + +```bash +mysh import --from yaml --file prod.yaml --all +``` + +### 受け取り側に必要なもの + +**直接DB接続の場合:** + +- エンジニアから受け取ったYAMLファイル +- DBパスワード + +**Redash接続の場合:** + +- エンジニアから受け取ったYAMLファイル +- 自分のRedash APIキー(Redashのプロフィール設定から取得) + +## ベストプラクティス + +### 共有するエンジニア向け + +1. **エクスポート前に environment とマスクルールを設定する** — 受け取り側はこれを引き継ぐ +2. 実ユーザーデータにアクセスする接続は **production environment** を指定 +3. **マスクパターンを網羅的に設定する** ことで意図しないデータ露出を防ぐ: + ```bash + mysh edit prod + # マスクを以下に設定: email,phone,*password*,*secret*,*token*,*address*,*name* + ``` +4. **YAMLファイルの共有経路はセキュアに** — パスワードは含まれないが、ホスト名やユーザー名は含まれる + +### 受け取る側 + +1. `MYSH_MASTER_PASSWORD` をシェルプロファイルに設定しておくと、AIアシスタントから対話プロンプトなしでmyshを使える +2. インポート後 `mysh ping` で接続を必ず確認する +3. マスク設定はエンジニアの指示なしに変更しない + +## Redash接続の共有 + +Redash接続も同じ流れで共有できます。 + +```bash +# エンジニアがエクスポート +mysh export analytics > analytics.yaml + +# 受け取り側は自分のAPIキーを入力してインポート +mysh import --from yaml --file analytics.yaml +``` + +各メンバーが自分のRedash APIキーを使うので、アクセスはRedashの監査ログで個別に追跡できます。