Artisan コマンド
Lase が提供する Artisan コマンドの一覧です。
lase:reseed
migrations テーブル以外のすべてのテーブルを truncate してからシーダーを実行します。データベースをシーダーの初期状態にリセットしたい場合に使用します。
php artisan lase:reseed| オプション | 説明 |
|---|---|
--force | 確認プロンプトをスキップして実行する |
DANGER
このコマンドはローカル環境(APP_ENV=local)でのみ実行可能です。すべてのテーブルデータが削除されます。
lase:index-docs
docs/ ディレクトリの Markdown をチャンク分割・Embedding 化して DB に保存します。AI チャットの RAG(検索拡張生成)に使用されます。
php artisan lase:index-docs| オプション | 説明 |
|---|---|
--force | 変更がないファイルも再インデックスする |
--source= | 対象を相対パスで絞り込む(例: --source=auth/login.md)。複数指定可。指定時は孤立チャンクの削除を行わない |
--no-prune | 参照されなくなったチャンクを削除しない |
ファイル内容の MD5 が一致する場合はスキップされるため、変更が無ければ Embeddings API は呼ばれません。実行のたびに、削除・リネームされたドキュメントの孤立チャンクも掃除されます。
.vitepress/ 配下は除外されますが、index.md は YAML フロントマターを除去した本文が取り込まれます。
config('lase.ai.embedding_model') や embedding_dimensions を変更した場合は、--force を付けなくても自動的に再インデックスされます(各行に生成時のモデル・次元数を保持しているため)。古いモデルのチャンクは検索対象から除外され、再インデックス時に置き換わります。
失敗時の挙動
デプロイをブロックしないよう、無駄な待ち時間が発生しない設計にしています。
| 状況 | 挙動 |
|---|---|
OPENAI_API_KEY 未設定 | Embedding が必要になった時点で即終了(API を呼ばない)。変更が無くスキップだけで終わる場合はキー不要なので成功する |
| 認証エラー・リクエスト不備(4xx) | 再試行しても結果が変わらないため 1 回で打ち切る |
| レート制限(429)・サーバエラー(5xx)・通信障害 | 200ms 間隔で最大 3 回まで再試行する |
| 連続 3 ファイル失敗 | 残りを処理せず中断する(API 障害が疑われるため)。中断時は孤立チャンクの削除も行わない |
実行タイミング
デプロイ時と日次スケジューラーの二重で実行します。
1. デプロイ時(codebase-jp/actions の ansible-deploy に組み込み済み)
app-deploy.yml で、Blue-Green のトラフィック切り替え後に実行されます。
- name: Build AI chat document index (RAG)
ansible.builtin.shell: |
docker exec "app-{{ _next_color }}" sh -lc 'cd /var/www/app && timeout 300 php artisan lase:index-docs'
register: _index_docs
changed_when: false
failed_when: false
when: "app_role == 'PRIMARY'"意図的に以下の設計にしています。
| 設計 | 理由 |
|---|---|
| 切り替え後に実行 | インデックス生成の待ち時間をユーザーに見せない |
failed_when: false | Embeddings API 障害でデプロイを失敗させない(スケジューラーがリトライする) |
timeout 300 | API 全滅時に長時間ハングさせない |
app_role == 'PRIMARY' | DB を共有するため、複数の app ノードから同時に書き込まない |
2. 日次スケジューラー(デプロイ時に失敗した場合の保険)
$schedule->command(IndexDocs::class)->dailyAt('03:00')->withoutOverlapping();TIP
ハッシュ一致でスキップされるため、docs を変更していないデプロイでは Embeddings API を呼ばず 1 秒未満で完了します。33 ファイル / 265 チャンク規模の全件生成でもコストは 0.1 円程度、所要時間は 3〜10 秒です。
lase:send-admin-mails
管理者メールの送信を実行します。スケジューラーから定期実行されることを想定しています。
php artisan lase:send-admin-mailslase:renew-subscriptions
サブスクリプションの更新処理を実行します。スケジューラーから定期実行されることを想定しています。
php artisan lase:renew-subscriptions終了したサブスクリプションを持つテナントを対象に、次のように処理します。スケジューラーから毎日実行してください。
| サブスクリプション | 対象になる時期 | 処理 |
|---|---|---|
更新する(renews = true) | 前月以前に終わったもの(月初) | 当月1日〜末日のサブスクリプションを新たに作り、Senter の利用を更新する |
更新しない(renews = false。トライアルなど) | 昨日までに終わったもの | テナントの現在のサブスクリプションを外す |
トライアルは新規登録の日からちょうど1か月(翌月の応当日の前日まで。応当日が無い月は末日まで)で、月の途中で終わります。毎月1日にだけ実行すると、終わったトライアルが翌月1日まで使えてしまいます。
$schedule->command(RenewSubscriptions::class)
->dailyAt('00:01')
->withoutOverlapping()
->onOneServer();lase:tenant:suspend
テナントを緊急停止します。管理画面が使えない状況でも止められるようにするためのコマンドです。
php artisan lase:tenant:suspend acme --reason="不正アクセスの調査"| 引数・オプション | 説明 |
|---|---|
code | テナントコード |
--reason= | 停止の理由。省略した場合は対話で入力を求めます |
停止するとテナント画面・API・MCP へアクセスできなくなります。契約は維持されるため、サブスクリプションの更新は通常どおり行われます。コンソールからの実行は操作者を特定できないため、アクティビティログには残りません(アプリケーションログには出力されます)。
lase:tenant:resume
テナントの緊急停止を解除します。
php artisan lase:tenant:resume acme| 引数 | 説明 |
|---|---|
code | テナントコード |