個人開発でサービスをリリースまで持っていくポイント

# LGTMoon

私は個人で LGTMoon というサービスをリリース、運用しています。

* https://lgtmoon.dev/

![LGTMoonのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29024/d0db6594-01d1-63ae-26cc-08596b091ab8.png)

LGTMoon は、 LGTM 画像を簡単に作成できるサービスです。


# 個人開発でサービスをリリースするとき

私は仕事をしながら個人開発をしているので、個人開発に割ける時間は多くありません。一番重要なのは、 **少ない時間で開発を終えて、リリースまで持っていく** ことです。

それに加えて「お金（初期費用）がかからない」とより良いです。

# 開発時に注意した点

## 機能は最小限にして最速で実装を終わらせる

LGTMoon にはログイン機能がありません。データベースにも画像テーブル1つしかありませんし、アプリケーションとしてめちゃくちゃシンプルです。LGTMoonサイト内の画像検索機能すらありません。

個人開発では時間が限られているので、機能はめちゃくちゃシンプルにする必要があります。機能をめちゃくちゃシンプルにすると、**サービスの使い方がわかりやすくなる** というメリットもあります。

LGTMoon については、とにかく**リリースする**、そして、**使い方がシンプル**を目標にしていたので、最小の構成でリリースしました。機能追加は後でいくらでもできます。


## 技術習得とサービス開発を一緒にする際は注意

「新しい言語を触ってみたい」等の技術習得と、「こんなサービスをリリースしたい」という目標を混ぜると危険です。

技術習得に時間がかかってしまった結果、サービスリリースのモチベーションが失われてしまいます。

技術習得に重きを置くのか、サービスのリリースに重きを置くのかは、十分考えましょう。絶対リリースしたいなら、リリースが最終目標ですし、技術習得が目標なら、最悪リリースまで行かなくても良いと思います。


# Heroku は個人開発にオススメ

これがこの記事で一番言いたいことかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29024/eeef1665-91b1-6685-47b0-b9ee394e1a0d.png)

LGTMoon は Heroku にデプロイされています。Heroku は、AWS と同じ、クラウドアプリケーションプラットフォーム（アプリケーションサーバー）です。

* https://heroku.com

Heroku が個人開発にオススメな理由が2つあります。

- 一瞬でセットアップできる
- 料金が無料

### 一瞬でセットアップできる

Heroku は、インスタンス立ち上げて、GitHubと連携したら完了。GitHub から最新のコードを引っ張ってきてデプロイできるし、サービスリリースに必要な設定がすぐに終わります。

ネットワーク構成どうするとか、セキュリティーグループとか、ユーザーとかロールとか、一切考える必要はありません。サーバーにApache等をインストールする作業も不要です。

### 料金が無料

Heroku は、**1サービスまでなら無料で運用できます**。

独自ドメイン + HTTPS 対応も、CloudFlare を使えば無料です（CloudFlare を使わず、 Heroku だけでやろうとすると有料です）。

ただし、サービスが大規模になると料金が一気に上がります。個人開発の範囲だと、課金しても月数千円でしょうが、万が一サービスがめちゃめちゃ大きくなった場合は、VPSや、AWS等に移行したほうが良い可能性もあります。

# 個人開発向けの言語と、そうではない言語

![利用している技術スタックのロゴ](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F29024%2F80085114-7b75-0e03-c5ab-22b7f79a9345.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=e1b2cc213c8d38922b1564237308d1d0)

LGTMoon のサーバーサイド開発言語は Scala で、フレームワークは Play Framework です。フロントエンドには Vue.js を使っています。

## サーバーサイドの言語 Scala は個人開発向けではない

言語に Scala を選択したのは、当時 Scala を勉強していたからでしたが、今となっては、 Go で書き直したいくらいです。

Scala は言語仕様が複雑で学習コストが高いです。言語仕様が複雑だと、簡単な実装でも時間がかかります。

さらに、Scala は利用者が少ないため、ググっても情報が出てきづらいです。仕事で Scala をやる場合は、開発チームで知見を共有できますが、個人プレーだとこの点がきついです。

一方、 Scala を採用したメリットもあります。

- Akka Actor が優秀（画像生成のキューイング処理で使っている）
- 非同期処理でサーバーのリソースを有効活用してくれるので、Herokuのしょぼいサーバーでもちゃんと動いている（個人の感想です）

## フロントエンドの Vue.js は個人開発向け

フロントエンドには Vue.js を採用しました。これは単に当時 Vue.js が流行っていたからですが、結果的には大正解でした。

大規模なサービスだと React.js を採用することが多いですが、React は学習コストが高いです。 

LGTMoon は状態管理すら不要なシンプルなアプリケーションなので、 Vuex も利用していません。最初期は、 `package.json` とか npm も使っていませんでした（今は使っています）。

シンプルなアプリケーションだと Vue.js で一瞬で実装できるので、おすすめです。


# 運用について

今までに発生した運用は2つありました

* なぜかアプリが落ちているので、Herokuの再起動ボタンを押す
* まずい画像を消す

稀に「アプリが落ちている」とtwitterで呼ばれることがあるので、その場合は Heroku の Restart ボタンを押すだけです。特に面倒なことはありません。

最近はありませんが、たまにエロい画像が大量にアップロードされていることがあります。これは見つけたら消しています。SQL流して、CDNのキャッシュを消すだけです。

たまに、「間違えて画像をアップロードしてしまった」とtwitterに連絡が来る場合もあるので、その時も同じ運用をします。今までで2,3回くらいありました。

画像を消す場合は SQL を実行する必要があるのですが、完全にマニュアル化されており、思考停止でコマンドをコピペしていくだけなので、ほぼノーコストでできます。

* https://github.com/yoshikyoto/lgtmoon/wiki/%E9%81%95%E5%8F%8D%E7%94%BB%E5%83%8F%E3%81%AE%E5%89%8A%E9%99%A4

完全にマニュアル化しておくと、考えなくてもできるので、頻繁に行う運用はマニュアル化して置くべきです。個人開発の場合、使える時間は限られているのでなおさらです。

# その他気づいた点

Google Analytics はとりあえず入れておいたほうがいいです。見るだけで面白いし、ユーザーが増えたりするとサービスのモチベーションになったりします。

LGTMoon を使っているユーザーは、平日が圧倒的に多いです。休日は殆ど使われません。みんな仕事のコードレビューの時とかに使ってるんですかね。面白いです。

休日はほとんど使われていないので、休日にデプロイすれば、なにか不具合があっても影響が少ないなと思っています。個人開発だとちょうど休日に開発＆デプロイしますし、仕事中使われるアプリは、個人開発と相性が良いのかもしれません。



# 実際に LGTMoon はいくらかかっているのか

|用途|金額|
|:--|:--|
|Heroku Postgres Hobby Basic プラン|$9（約1000円）/月|
|Google Domain（lgtmoon.dev ドメイン）|117円/月（1400円/年）|
|Google Cloud（画像検索API）|約1000円/月（利用頻度によって変わる）|

だいたい、月2000円程度かかっていますが、広告収入は500円〜1000円程度なので、赤字です。

Google Cloud の画像検索APIは、1日あたりのリミットをかけていて、一定金額（月3000円程度）を超えないようにしているのですが、平日はたまにリミットに引っかかっています。サービス的には問題なのですが、個人開発でお金には限界があるので、こう設定させてもらっています。

当然サービスリリース初期は全部無料でした。Google画像検索も 100リクエスト/日までは無料ですし、Heroku Postgres も無料プランがあります。容量が足りなくなったため、現在は一番安い $9/月 のプランにしています。

* https://elements.heroku.com/addons/heroku-postgresql

# さいごに

この記事では技術的な詳細は書きませんでしたが、使っている技術の詳細はこちらの記事に、

* https://qiita.com/yoshikyoto/items/4910b1a4bcefe7f5ab8c

また、ブログでも LGTMoon に関する記事をいくつか書いています

* https://www.utakata.work/archive/category/LGTMoon

サービスもぜひ使ってください

* https://lgtmoon.dev/

記事が LGTM なら、 LGTMoon で LGTM 画像を作って、コメントしてみてください。
`![LGTM](https://cdn.lgtmoon.dev/images/104695)` のような GitHub Markdown をコメントに書けばOKです。LGTMボタンも押してね。