RyomaHori

Works

Work 19

Convio

動画を音声 10 形式・動画 5 形式へ変換する個人 SaaS。非同期変換キュー・サブスク課金・本番障害の根本原因究明まで一人で回した

Period
2026-02–2026-08
Role
個人開発(企画・要件定義・フルスタック実装・インフラ・本番運用・障害対応)
Stack
Python, Flask 3 (app factory + Blueprint), Flask-SQLAlchemy, Flask-Login, Celery, Redis, 動画ダウンローダ (OSS), FFmpeg, Stripe, Google Auth (OAuth), Gunicorn, nginx, Vanilla JavaScript, VPS, systemd
Links
No public link (private)
  • 2026-08-24 の本番障害『処理中の固着』を 2 つの根本原因まで特定 — (1) Celery の FAILURE state に dict meta を渡すと AsyncResult.state が ValueError を吐き永久 pending 化する (2) AsyncResult(id) を app 未指定で使うと gunicorn gthread のスレッドローカルで DisabledBackend に解決される
  • 同じコミットで回帰テストを追加(tests/test_convert_api.py 225 行、tests/test_task_manager.py 323 行ほか約 750 行)
  • TaskManager を単一プロセス前提のインメモリから Redis 裏書きへ移行し、Gunicorn マルチワーカー間で状態共有
  • デスクトップアプリ配布(PyInstaller)からサーバー運用へ、配布形態そのものを転換した意思決定が git に残る