自社の文字起こし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日間止まりました。
開発したもの
試作ではなく、プロダクト全体の書き換えです。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の変更だけで済みました。
エンジニアリングの成果
公開前の負荷テストを共用マシンで計測した値です。絶対値は目安ですが、比率はそのまま当てはまります。
- 本番の切り替えは約4分の停止時間で完了
- 切り替え後、登録、アップロード、ライブ状況、ダウンロード、AI、API、管理画面を本番で確認
- 負荷テストでコネクションプールの不具合を発見し、公開前に修正
- 右から左へ書く言語のPDFを含む99言語
技術
- Rust
- axum
- PostgreSQL
- Typst
- OpenAI Whisper
- Azure Speech
- Stripe
- Kubernetes