概要
Sprint Cycle 15では、SNS共有時のビジュアル確立(OGP画像生成)、ヘルスチェックのUptime対応、Fly.ioとのヘルスチェック連携、ランディングページのパフォーマンス最適化を実施しました。
| 対応内容 | 状態 |
|---|---|
| OGP画像生成(SVG → PNG変換) | 完了 |
| ヘルスチェックにUptime追加 | 完了 |
| Fly.ioヘルスチェック連携 | 完了 |
| GA/Adsプレースホルダー削除 | 完了 |
| DNS Prefetch最適化 | 完了 |
1. OGP画像生成
SNSでリンクを共有した際に表示されるOGP(Open Graph Protocol)画像を作成しました。SVGでブランドデザインを作成し、rsvg-convertでPNGに変換。1200x630pxの標準サイズで59KBに収まっています。
Twitter、Facebook、LINEなどでミセバンAIのリンクを共有すると、ブランドカラーとロゴが映えるカードが表示されるようになりました。
2. ヘルスチェックにUptime追加
std::sync::OnceLock<Instant>でサーバー起動時刻を一度だけ記録し、/api/v1/healthのレスポンスにuptime_secondsフィールドを追加しました。
// OnceLock for server start time
static START_TIME: std::sync::OnceLock<std::time::Instant> = std::sync::OnceLock::new();
// Health response with uptime
struct HealthResponse {
status: &'static str,
version: &'static str,
database: &'static str,
uptime_seconds: u64,
}
OnceLockはスレッドセーフな一度きりの初期化を保証するため、サーバー起動時にInstant::now()を記録し、ヘルスチェック時に経過秒数を計算します。再起動の検知やアップタイム監視に活用できます。
3. Fly.ioヘルスチェック連携
fly.api.tomlにHTTPヘルスチェック設定を追加しました。Fly.ioのプラットフォームが自動的にアプリケーションの健全性を監視し、異常検知時にインスタンスを再起動します。
# fly.api.toml health check
[http_service.checks]
[http_service.checks.health]
interval = "30s"
timeout = "5s"
grace_period = "10s"
method = "GET"
path = "/api/v1/health"
30秒間隔でGETリクエストを送信し、5秒以内にレスポンスがなければタイムアウト。デプロイ直後は10秒のグレースピリオドで起動完了を待ちます。
4. GA/Adsプレースホルダー削除
ランディングページにGoogle AnalyticsとGoogle Adsのトラッキングコードが含まれていましたが、IDがプレースホルダー(G-XXXXXXXXXX)のままでした。未設定のトラッキングコードはブラウザから無駄なHTTPリクエストを発生させ、ページロードを遅延させます。
該当コードをコメントアウトし、実際のトラッキングIDが取得できた段階で有効化する方針としました。
5. DNS Prefetch最適化
ランディングページの<head>にGoogle Fonts、Supabase、API向けのdns-prefetchとpreconnectタグを追加しました。ブラウザがページ描画前にDNS解決とTCPハンドシェイクを先行して行うため、外部リソースの初回ロード速度が改善されます。
テスト結果
全13テスト合格。既存テストへの影響はありません。
ブランドビジュアルの確立、運用監視の強化、フロントエンドの最適化を同時に進め、プロダクトの完成度をさらに高めました。次のスプリントではユーザー向け機能の拡充に注力します。