2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

希少がんになったので、AIツールに課金して「完全無料」のコミュニティサイトを爆速で作った話【Django】

2
Posted at

Gemini_Generated_Image_v1weihv1weihv1we.png

はじめに

今回は個人開発で、原発性縦隔大細胞型B細胞リンパ腫(PMBCL)という希少がんの患者・家族向けオンラインコミュニティ「PMBCLテラス(https://pmbclterrace.pythonanywhere.com/)」をリリースしたお話です。

「なぜ急にそんなニッチなサイトを?」

実は昨年、私自身がこの「PMBCL」という希少がんの告知を受けました。いきなり病名を告げられ、頭が真っ白になりながらネットで検索しても、患者のリアルな生の声がほとんど見つからなかったのです。

(redditで検索してやっといるぐらい)

LINEのオープンチャットの利用しましたが、チャットの性質上、過去の貴重な「体験談」や「副作用の記録」がどんどん上に流れていってしまいます。「これでは、新しく病気になった人が後から情報を探すのは無理ゲーなのでは?」と強く感じました。

「だったら、情報がストックされて、誰もが匿名で安心してホッとできる居場所を自分で作ってしまおう!」。

と思い立ったのが開発のきっかけです。

ただ、一つ大きな問題がありました。。

私自身、エンジニアからだいぶ離れており、完全に浦島太郎状態だったのです。「最近の開発ってどうなっているの…?」というレベルからのスタートでした。

そこで、現代の強力な武器である「AIコーディングツール」にガッツリ頼りつつ、ランニングコスト「完全ゼロ」の環境を構築してみました。


技術スタックとインフラ構成

ランニングコストを抑えつつ、保守性を高める構成にしています。

  • バックエンド: Python 3.13 / Django 6.0
  • データベース: SQLite3
  • フロントエンド: Bootstrap 5 + Bootstrap Icons
  • 静的ファイル: WhiteNoise
  • 画像ストレージ: Cloudinary
  • インフラ: PythonAnywhere(無料のBeginnerプラン)
  • CI/CD: GitHub Actions
  • その他ツール: Jazzmin(管理画面)、EasyMDE(エディタ)、hCaptcha(スパム対策)

サーバー容量25GBしかない問題と「無料枠」の制約ハック

個人開発あるあるの「いかに無料枠で戦い抜くか」という縛りプレイ。今回は以下の方法で乗り切ろうと奮闘しました。

1. EasyMDE + Cloudinary による画像アップロード

体験談の投稿には、Markdownエディタ「EasyMDE」を採用しました。ただ、今回のサーバーは容量が25GBしかないため、ユーザーが画像をローカルにどんどん保存していくと、将来的に運用が厳しくなるのは目に見えていました。

そこで、画像は非同期処理で直接Cloudinary(クラウドストレージ)に飛ばす構成にしています。

  • サイズ制限: サーバー側でPillowを使って長辺1200px以下に自動リサイズし、最大20MBまでに制限。
  • UX向上: エディタ下部に アップロード中... XX% と進捗率を出して、ユーザーを不安にさせない工夫も入れています。

2. PythonAnywhereの「Cron使えない」問題と立ちはだかった壁

画像の容量を節約するため、「アップロードから30日経過した画像を自動削除するカスタムコマンド(python manage.py cleanup_images)」を作成しました。

これを定期実行したかったのですが、PythonAnywhereの無料プラン(Beginner)には以下の厳しい制約がありました。

  • 以前は無料枠でも使えたはずの「Scheduled Tasks」が、現在は利用できない模様(公式ヘルプ参照)。
  • 「ならばGitHub ActionsからSSH接続して外部から叩こう!」と試みるも、無料枠では外部からのSSH接続が弾かれ、status 254 エラーで無惨に失敗。

【現在の解決策:Webhook方式への方針転換】
SSHがダメならHTTP通信だということで、現在は以下の「Webhook方式」で実装を進めています。

  1. Django側にバッチ処理起動用の「特定のURL(エンドポイント)」を作成。
  2. GitHub Actionsの定期実行(cron)から、そのURLへ curl コマンドでHTTPリクエスト(POST)を送信して内部処理をキックする。
  3. セキュリティ対策として、リクエストのヘッダーに「シークレットトークン(秘密の文字列)」を含め、認証できた場合のみ実行を許可する。

……と、完璧な代替案を設計したのですが、現在メインで頼りにしているAIツール(AntiGravity)が使いすぎによる「6日間の利用制限ペナルティ」の真っ最中のため、この実装はAIの制限が解除され次第試す予定です(笑)。

3. CI/CD(自動デプロイ)の挫折と今後の展望

同様の理由(無料枠ではSSH接続が弾かれる問題)で、GitHub Actionsから直接コマンドを叩く自動デプロイもあえなく失敗しました。

そのため、現状のデプロイは「PythonAnywhereのBashコンソールを開いて手動で git pull をする」という泥臭い運用になっています。
こちらも将来的には、PythonAnywhereのAPIを叩くか、上記と同じWebhook経由での自動化でリベンジしたいと考えています。


番外編:浦島太郎を救ったAIツール(Cline & AntiGravity)のリアルな課金レビュー

ブランクだらけの私が、Djangoの実装からインフラ設定まで一気に駆け抜けられたのは間違いなくAIのおかげです。今回実際に使ったツールの「ぶっちゃけレビュー」を残しておきます。

1. Cline(VS Code拡張機能)👉 【結論:神。迷わず課金すべき】

VS Code上で動く自律型AIエージェント。プロンプトで指示を出すと、既存コードを読んでファイルの作成・編集、ターミナルでのマイグレーションまで勝手にやってくれます。

  • 所感: コーディング精度が非常に高く、何よりスピードが尋常ではありません。Djangoの面倒なテンプレート修正やニッチな設定ファイルも、爆速で組み上げてくれました。
  • コスト: 1日の集中的な開発で、API代が合計 $33.60(約5,000円) かかりました。(Claude sonnet使用) ![スクリーンショット 2026-03-13 13.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354168/28342430-f2f2-406c-b187-0b460b417e33.png)

    個人で使う分には高い気がしました。

2. AntiGravity 👉 【結論:及第点だが、制限がキツすぎて実用は厳しい】

自然言語からコードやプロトタイプを生成してくれるプラットフォームです。

  • 所感: 生成されるコードの品質自体は悪くなく、プロトタイプ作りには使えます。Agent機能で自動動作テストもしてくれますしね。
  • 欠点: 有料のProプランを契約しているのに、すぐに利用上限が来てしまうのが最大のネックです。さらに使いすぎると「6日間の利用制限」という激重なペナルティを食らいます。週末に一気に開発を進めたい個人開発者にとって、この足枷は正直キツすぎます。現状、メインウェポンとしてはおすすめできません。
  • ![スクリーンショット 2026-03-13 13.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354168/5b327e48-f550-4119-a7f0-35c47b0ffe09.png)

おわりに

エンジニアとしての長年のブランクと、希少がんという想定外の病気。色々なことが重なりましたが、「無料サーバーの制約」を外部APIやGitHub Actionsでねじ伏せていく過程は、純粋に開発の楽しさを思い出させてくれました。

(現職エンジニアに戻る気はゼロですがw)

何より、技術の力で「情報がなくて不安な思いをしている人」の課題を一つ解決し、居場所(PMBCLテラス)を作れたことが最高に嬉しいです。

同じように個人開発でコストを抑えつつ、AIの力で爆速開発したい人の参考になれば幸いです!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?