レンタルサーバで Django は動かせるのか
Django をホスティングしたいと思ったとき、まず考えるのはレンタルサーバではないでしょうか。しかし、結論から言うと レンタルサーバで Django を動かすのは非常に難しいです。
理由は単純で、Django のようなフレームワークを動かすには WSGI や ASGI といったインターフェースに対応している必要がありますが、一般的なレンタルサーバはこれに対応していません。PHP は .htaccess ひとつで動きますが、Python の Web アプリはそうはいきません。
そのため、通常は VPS やクラウド(AWS、GCP など)でサーバを借りて、nginx や Apache と uwsgi / gunicorn を自分でセットアップしてホスティングすることになります。これはこれで確実な方法ですが、サーバの構築・管理・セキュリティパッチの適用など、アプリ開発以外の運用負荷がかなり大きくなります。
Railway という選択肢
そんな中、米国のサービスで Railway というユニークな PaaS を見つけました。
Railway はコンテナ単位でサービスを立ち上げることができるプラットフォームです。類似の PaaS(Heroku、Render など)は他にもありますが、MySQL がネイティブにサポートされているのは Railway ならではの特徴だと感じました。
GitHub リポジトリを指定するだけでデプロイ
Railway の最大の魅力は、GitHub のリポジトリを指定するだけで自動的にビルド・デプロイしてくれることです。
具体的には、リポジトリに requirements.txt があれば Python プロジェクトと判断し、コンテナとしてビルドしてデプロイします。Dockerfile があれば Docker イメージをビルドしますし、go.mod があれば Go、他にも Rust、PHP、C/C++ なども自動検知してビルドしてくれます。
これは画期的だと思いました。
nginx / Apache のセットアップが不要になる
Django を Railway にデプロイする場合、静的ファイルの配信は WhiteNoise 経由にする必要があります。WhiteNoise は通常 nginx / Apache が担う静的ファイルの配信を Django(Gunicorn)単体でこなせるようにする Python ライブラリで、pip install whitenoise して MIDDLEWARE に追加するだけなので導入コストは小さいです。それさえ対応すれば nginx や Apache のセットアップが一切不要 になります。
なお、デプロイ前に collectstatic を実行して静的ファイルを集約しておく必要があります。「Python 経由だと遅くなるのでは?」と思うかもしれませんが、WhiteNoise は長期キャッシュヘッダーを付与するため、一度取得したファイルはブラウザ側でキャッシュされ、そもそもサーバへのリクエスト自体が減ります。一般的な規模のアプリであれば nginx / Apache との速度差はほぼ体感できないレベルです。
VPS で Django を運用した経験がある人なら分かると思いますが、nginx の設定ファイルを書いて、gunicorn と連携させて、SSL 証明書を設定して…という手間がまるごとなくなるのは大きいです。
データベースのサポート
Railway では以下のデータベースがサポートされています。
- MySQL
- PostgreSQL
- Redis
- MongoDB
また、Docker イメージを指定できるので、原理的には何でも対応できるはずです。
MySQL を選んだ場合、Docker で環境変数を指定するような感覚で、Django コンテナに MySQL サービスの接続情報を渡すことができます。DATABASE_URL や個別の MYSQL_HOST、MYSQL_PORT などの環境変数を、例えば、MYSQL_HOST="${{MySQL.MYSQLHOST}}" のような形式で Railway の管理画面で設定するだけです。
Git push でデプロイ完了
アプリサーバのソースコードを GitHub に commit すると、Railway が自動的にコンテナをビルドして起動してくれます。つまり、開発のワークフローは以下のようになります。
- ローカルで開発・テスト
git pushする- Railway が自動ビルド・デプロイ
- 数分後に本番環境に反映
CI/CD のパイプラインを別途構築する必要もありません。
manage.py コマンドも実行できる
python manage.py shell はできるものなのか、と最初は思いましたが、できます。Railway の CLI ツールを使えばコンテナに対して SSH 接続を実行できるためです。当然、dumpdata したデータを標準入力からリダイレクトして loaddata することもできます。
MySQL データベースに直接接続することもできる
MySQL データベースを直接見ることはできるのか、と思いましたがこれもできます。MySQL サービスの Public Networking で proxy を有効にしておく必要がありますが(MySQL サービス作成直後はデフォルトで有効になっています)、CLI ツールで接続先を MySQL サービスに指定すれば、払い出された Public IP アドレスとポート上に MySQL サーバが見えます。mysql クライアントだけでなく、GUI クライアント(A5M2 など)からも同じ接続情報で繋ぐことができます。
アプリを他のユーザーに引き渡すこともできる
作ったアプリを他の人に渡すことはできるのか?できるらしいです。プロジェクト単位で Transfer Ownership することができ、別の Railway アカウントにプロジェクトごと移譲できます。
例えば、顧客向けのアプリケーションを代行して開発・構築しておき、本番運用に入ったタイミングで顧客の Railway アカウントに移譲すれば、以降の利用料金は顧客に直接請求されるようにできます。
料金体系
料金は従量課金ベースで、Hobby・Pro・Custom といったプランがあります。プランごとに月額の最低料金が設定されており、CPU・メモリ・ネットワークなどのリソース消費量に応じて上乗せされる仕組みです。小規模なアプリであれば最低料金の範囲に収まることも多いです。
Django 以外でも使える
Django のホスティング先として見つけた Railway ですが、前述の通り Python に限らず、Go、Rust、PHP、Node.js、Docker イメージなど、何でも対応できます。
Terraform や CloudFormation のような IaC ツールを使いこなして一気に環境構築できたり、Kubernetes を活用できるようなチームには物足りないかもしれません。しかし、インフラをもっと簡単に扱いたい、インフラ人材を用意し続けるのが不安、という状況にはよくマッチしていると思います。
個人開発のサービスや、小規模なプロジェクトのホスティング先としてかなり優秀だと思います。
興味がある方は Railway から試してみてほしい。