開発事例 AI・SaaS

自社の文字起こしSaaSを7日でRailsからRustへ。ログアウトは1件も発生せず

SoundScript.AIは99言語で音声を文字に変換します。Railsのアプリは、サイト、バックグラウンド処理、Redisを1台の小さなサーバーで動かしており、限界が見えていました。Rustへ書き換え、旧アプリと1ページずつ突き合わせて確認し、約4分の停止時間で本番を切り替えました。

クライアント
Envixo
プラットフォーム
ウェブアプリとモバイルAPI
業界
AI・SaaS
リリース
2026

課題

Rails 8.1のアプリは動いていましたが、Puma、Sidekiq、Redis、PostgreSQLがメモリ1.9 GBのサーバーを共有していました。負荷がかかるとページの応答に数秒かかり、2026年7月にはバックグラウンド処理が5日間止まりました。

導入前: メモリ1.9 GBの1台のサーバーにPuma、Sidekiq、Redis、PostgreSQL
改善後: Kubernetes上のウェブとワーカーのサービス、マネージドのPostgreSQL 18。Redisは廃止し、キュー、ライブ更新、レート制限はPostgreSQLで実行
導入前: 同時接続100での公開ページで中央値2.7 s
改善後: 同じテストで中央値11.7 ms
導入前: アラビア語、ヘブライ語、ペルシャ語、ウルドゥー語、デーヴァナーガリー文字で読めないPDF出力
改善後: TypstとNotoフォントで組んだPDF。字形の処理も右から左の文章も正しく表示
導入前: シークレットが未設定だと、署名のないイベントも受け取ってしまう決済と文字起こしのwebhook
改善後: webhookの署名を常に検証
導入前: ピーク時のメモリ937 MB
改善後: ピーク時のメモリ102 MB

開発したもの

試作ではなく、プロダクト全体の書き換えです。99言語のサイト、文字起こしの処理、AI要約とチャット、各種エクスポート、課金、モバイルAPI、管理コンソールまで含みます。

URLと仕様はそのまま

多言語の各ページ、webhookのパス、モバイルAPIのエンドポイント、ストレージバケットはすべて同じまま。リンクもアプリも連携もそのまま動き続けました。

ログアウトはゼロ

RustのアプリがRailsのセッションCookieと既存のパスワードハッシュを読むため、ユーザーは切り替えをまたいでログインしたままでした。

データは前提にせず検証

最後のコピーの後、アカウント、文字起こし、利用量、サブスクリプションの行数とチェックサムを旧データベースと新データベースで照合しました。結果は完全一致です。

同一性を検証する仕組み

11種類のユーザーと4言語にわたる1,126件のページリクエスト、39件のフォーム送信、343件の管理画面リクエストを両方のアプリで再現し、結果を比較しました。

プロダクトのすべて

WhisperとAzureによる文字起こし、ライブ状況、AI要約とチャット、TXT・SRT・DOCX・PDFのエクスポート、StripeとGoogle Playの課金、そして管理コンソール。

安全な戻り道

切り替え後も旧サーバーを2週間そのまま残したので、切り戻しはDNSの変更だけで済みました。

エンジニアリングの成果

公開前の負荷テストを共用マシンで計測した値です。絶対値は目安ですが、比率はそのまま当てはまります。

230x
負荷時の応答中央値の改善
9x
ピーク時メモリの削減
880
変更ごとに実行する自動テスト
7
最初のコミットから本番までの日数
  • 本番の切り替えは約4分の停止時間で完了
  • 切り替え後、登録、アップロード、ライブ状況、ダウンロード、AI、API、管理画面を本番で確認
  • 負荷テストでコネクションプールの不具合を発見し、公開前に修正
  • 右から左へ書く言語のPDFを含む99言語

技術

  • Rust
  • axum
  • PostgreSQL
  • Typst
  • OpenAI Whisper
  • Azure Speech
  • Stripe
  • Kubernetes

ビジネスに合わせたソフトウェアが必要ですか?

連携、社内ツール、アプリ、プラットフォームを、AIエージェントを指揮するシニアエンジニアがオーダーメイドで開発します。必要なことをお聞かせいただければ、私たちならどのように構築するかをお見せします。