個人開発を黒字にする技術

最近は個人開発は自分のOSSのメンテで手がいっぱいになってしまったのでサービス開発のようなものは普段あまりやらないのだが、大学院*1で今学期、何作ってもよいという感じの授業を取ってWeb/iOS/Androidアプリ*2を全て作るという体験をする中で、たまたま個人開発のコストを抑える活動をしたので、その時に調べたり考えたりしたことを書いておく。

Herokuで無料にする

Herokuでは毎月550時間free dynoが使え、クレジットカードを登録しておくと更に450時間、合計1000時間無料で使える。Herokuは30分アクセスがないと一旦停止するが、今回授業で作ったサービスでこれを使い切らないことは明らかだったので最初はこれでセットアップした。セットアップも簡単だし、PostgreSQLも無料でついてくる。

ただ、コールドスタートに10秒くらいかかり、これがこのサービスではUX的に致命的だったため、元々運用していたVPSに同居させることで高速化を図った。

安いVPSの選定

個人VPSは10年くらい持っていて、これまで様々なVPSサービスを試してきたが、今回いろいろ整理する前はConoHaを使っていた。最初はDBサーバーとVPS 1台で2484円という感じだったが、安くするためにDBをVPS同居にして1848円までは圧縮した。

ただ、今回もう一つサービスを足すにあたって、当時のVPSではもう一つWebサーバーを立てるほどキャパシティに余裕がなく、かといって家計を削って値段を上げるのもなあという気持ちもあった。そもそも、USに移住したので日本のVPSだとレイテンシにやや不満があった。

そこで、安くてリソースが多く、可能なら自分に近いリージョンのVPSを真面目に調べ直した。結論を書くと、個人開発のコストはDB次第という記事のブコメにも書いた vCPU 4コア / 8GB RAM / 100GB NVMe *3 で月 $8.24 のVPSを発見し、それを使っている。ContaboのCloud VPS SのUnited States (Central)がその値段で、EUだと月 $6.99、Asiaだと月 $9.99 になる。

他にもいくつか有望ぽい奴は見つけたが、VPSCOMPというサイトで見つけたものが多かった気がするので、とりあえずこのサイトで好みのやつを探していただくのが良いかもしれない。

サーバーメンテの労力を最小化する

Kubernetesをやめる

4年前に練習用途で個人サーバーをKubernetes化したのだが、ある日突然クラスタがクラッシュして再起不能になったこともあったりと管理コストが無ではないし、Kubernetesそのものがめちゃくちゃリソースを使うのでサーバー代はかさむし、会社で自分のチームがEKSを使い始めて触りたければ触れる状態になったので個人サーバーではやめることにした。今はものすごく素朴に動かしているので、突然何かがクラッシュするみたいな状況は見ないし、したとしてもsystemdがサービスを再起動して勝手に直ると思われる。

式年遷宮を自動化する

自作プロビジョニングツールであるmitamaeを使って個人サーバのセットアップを自動化しており、これは何年も秘伝のタレ的に使い続けられている。Ubuntuのバージョンを上げる時にdist-upgradeで済ませたこともあるが、サーバーを立て直す労力がそこまで高くないので、VPSごと立て直してしまう*4ことが割とある。これでついでにDBサーバーのバージョンも上がりDBメンテ相当になるが、個人サーバーなので多少のダウンタイムは許容できるし pg_dump してrestoreしてくるけど、9GBほどのDBではすぐ終わる。そんな頻繁に必要なわけじゃないし、例の記事がいうほどDBサーバーのメンテナンスは大変ではない気がしている。

Let's Encryptの自動化

Let's Encryptの証明書が3か月おきに失効するので、これの更新がうまくいっていないのを誰かに指摘されるということが多く、プロビジョニングが自動化された環境下ではこれが一番運用労力がかかっていた印象がある。普通はcertbotを使えばいいと思うのだが、何か割とセットアップに手こずった記憶があり、Ruby製のacmesmithを使っていて、自分の得意な言語かつ読みやすいサイズなので何かうまく動かなくてもコードを読むことでどうにかしやすくなった。ここ最近は壊れることがなくメンテナンスフリー。

Google AdSenseの設置

サイトに広告を一切貼っていなかったころ、VPSの運用負荷を下げすぎてほとんど触ることがなくなり、しかもそこで動かしているアプリもそんなに触る動機がない状態になり、金の無駄なのでVPSを止めるか検討したことがあった。ただ、多少アクセスのあるサイトを動かしていたため、止める前に試しに広告を貼ってみたところ、ConoHaのVPS代より売上がコンスタントに出る感じだったので、そうすることにした。

Gitstar Ranking *5 という、GitHubのスターの合計数でランキングを出すという非常に浅ましいサービスを8年前に作ったのだが、1日1000~2000PVくらいしかアクセスがないのに毎月$20-30くらい売り上げている。画面全体に出る広告は使っておらず、自分のPCの画面サイズではトップページでファーストビューに入ってこない程度に控えめにしか貼っていないのだが、それでもクリックしてくれる人がいるらしい。

モバイルアプリの公開費用

授業の成果物のため、React Nativeを使ってiOS / Androidアプリを作ろうとしたところ、作ろうとしているものの要件上やや厳しい感じになり、そこがFlutterでは問題なさそうな感じなので、今回Flutterを使って簡単なモバイルアプリを作った。

DartとFlutterに関する感想はこの記事ではおいておくが、他の生徒にアプリをテスト公開するにあたり必要になったコストの話を書く。金はかかったが、元々動かしていたサーバーから発生している利益の中には収まってそう。

Firebase

今回作ったアプリではGoogleアカウント認証を使っていて、これは本来Web Viewを使うと別にFirebaseとか使わなくても実装できるのだが、それを実装しているサードパーティのFlutterプラグインが壊れており、公式が提供しているFlutterプラグインを使ったところ、流石Google、これは裏側にFirebaseが使われており、途中から有料になるサービスをまんまと使い始めさせられてしまった。ユーザー100人までは無料で、それに到達しなさそうなのでそのままやっているが、まあいざとなったらFirebaseを気合で外せばよさそう。

Google Play Developer Program

Androidアプリの評価に関してはapkを配布するというのでもよかったのだが、他の生徒がアプリの評価に参加する障壁を下げるため、Google Playが公式に提供しているTesting機能を使うことにした。これは $25 払ってGoogle Play Developer Programに入らないと使えないが、1回払ったらそれで終わりだし、額的にもAppleのそれに比べたらとても良心的だと思う。なおProductionのレビューも通したので今は普通に公開リリースして使っている。

Apple Developer Program

iOSアプリの開発でお賃金をもらうのをやめてから9年くらい経つが、少なくともTestFlightにアプリを公開しないとiOSユーザーの生徒にテストしてもらえないため、9年ぶりに再加入した。これはもう更新しないつもりで使っているが、年 $99 というのは高いなあと思う。今はPixelユーザーで次はiPhoneにしようか検討しているのだが、自分でアプリを作って使いたくなった時に年 $99 払わされるのは厳しいのでうーむという気持ちになっている。

確定申告

USに住んでるのでありとあらゆるものを確定申告しているのだが、この辺のコストをAdSenseの売上の経費として申請すると節税で更にコストが抑えられる。

まとめ

特にマネタイズに気持ちがなくて大して使われてないサービスでも、ほぼ無の運用労力と控えめな広告だけで黒字にでき、それで残りのサービスは自由にやることができる。

*1:今週期末試験が終わって、点数はまだ確定してないけど、明日卒業式。家庭の事情により出席しないけど

*2:厳密にはそれと連携するChrome拡張も作って公開している

*3:本来50GB NVMeか200GB SSDの2択なのだが、契約した当時はその時契約すれば同じ値段でNVMeが2倍の容量使い続けられるというキャンペーンがやっていた

*4:これを式年遷宮と呼んでいる

*5:元はGitHub Rankingという名前だったのだが、GitHubに怒られたので変えた