Closed13

【個人開発】Renderにデプロイして、独自ドメインを紐付けてみるまで

バタンヌバタンヌ

前提

  • 個人開発で無料でアプリよしなにホスティングしてくれるサービスであるRenderを使ってみようと思った。
  • 一度Renderを使ってデプロイしたことがあるので、復習がてら使ってみる
  • 脱ポートフォリオ感を目指して独自ドメインを取得してサービスと紐づけてみるとこまでをゴールにする
    https://qiita.com/MIDO-ruby7/items/d846e4728b9800a045e6
    ↑この記事を参考に、流行っているCloudflareで独自ドメインの取得をしてみる
バタンヌバタンヌ

前提知識を押さえる

DNSサーバーのAレコードとCNAMEレコードとは?

https://www.value-domain.com/media/a-record/
ドメインとIPアドレスを対応するレコードのこと。
CNAMEはサブドメインなどを紐づけておけば、AレコードのIPアドレスが変更になった時にサブドメインのIPも連動して変更されるので運用時の管理が楽になるのがメリット。
例)

  • Aレコード
名前 タイプ 値(IPアドレス) TTL
example.com A 203.0.113.10 3600
  • CNAMEレコード
名前 タイプ 値(ドメイン名) TTL
www.example.com CNAME example.com 3600

※補足
TTLは Time To Live の略で、
DNSの情報(AレコードやCNAMEレコードなど)を**キャッシュとして保持してよい時間(秒数)**のこと

バタンヌバタンヌ

まずはRender.comにデプロイする

※前提として、既にgithubに作成したアプリはアップされている。Dockerfileも既にありコンテナイメージは定義済み。
https://higmasan.com/docker/renderにdockerコンテナをデプロイする/

上記を参考にデプロイしてみる。

↓無料プランでできないこと

  • サーバーに直接SSHで入ってファイル操作やデバッグ
  • 永続的なストレージをサーバー内に持つこと
  • 負荷分散や複数コンテナでのスケールアウト
  • 手動で一時的なジョブを走らせること

↓無料でできるけどしょぼいこと

https://zenn.dev/tatehito/scraps/f7929e4a980d1c

  • 512mb(RAM)/0.1CPU
  • 非アクティブ状態が15分続くと自動でサーバーがスリープモードになり、次回リクエストが飛んだ時にすぐに起動せずにRenderのウェイティングページが表示されてしまう
  • ビルド時間が遅い。有料だと早くなるらしい
  • データベースが90日間有効だが、期限が切れると自動的に削除される

デプロイしてみよう!

今回はDBやそれに対応する環境変数もないので、特別設定する事項もなくdockerファイルを使うことと無料プランであることだけ選択して、いざデプロイ!

バタンヌバタンヌ

デプロイ時にエラーが発生1


ModuleNotFoundError: No module named 'api'
==> No open ports detected, continuing to scan...
==> Docs on specifying a port: https://render.com/docs/web-services#port-binding
==> No open ports detected, continuing to scan...
==> Docs on specifying a port: https://render.com/docs/web-services#port-binding
==> No open ports detected, continuing to scan...
==> Docs on specifying a port: https://render.com/docs/web-services#port-binding
==> No open ports detected, continuing to scan...
==> Docs on specifying a port: https://render.com/docs/web-services#port-binding
==> Port scan timeout reached, no open ports detected. Bind your service to at least one port. If you don't need to receive traffic on any port, create a background worker instead.
==> Docs on specifying a port: https://render.com/docs/web-services#port-binding
==> Timed out: Port scan timeout reached, no open ports detected. Bind your service to at least one port. If you don't need to receive traffic on any port, create a background worker instead.

恐らく現在のDockerfileが以下のような感じで、肝心なソースコードのコピーが抜けていたためだろう。。

FROM python:3.9-buster
ENV PYTHONUNBUFFERED=1

WORKDIR /src

# pipを使ってpoetryをインストール
RUN pip install poetry

# poetryの定義ファイルをコピー (存在する場合)
COPY pyproject.toml* poetry.lock* ./

# poetryでライブラリをインストール (pyproject.tomlが既にある場合)
RUN poetry config virtualenvs.in-project true
RUN if [ -f pyproject.toml ]; then poetry install --no-root; fi

# uvicornのサーバーを立ち上げる
ENTRYPOINT ["poetry", "run", "uvicorn", "api.main:app", "--host", "0.0.0.0", "--reload"]

docker-compose.yamlではプロジェクトのソースコードをマウントしていたために、ローカルではビルドできていたが、RenderではDockerファイルのみを参照して、ビルドするので恐らくapiフォルダが見つけられずにエラーになっていたのではないかと思う。

COPY . .

をDockerfile追加して再実行してみる。→この問題は解決した!が別エラーが発生した、、

バタンヌバタンヌ

デプロイ時にエラーが発生2


Cannot install nvidia-cufft-cu12.
Installing /src/.venv/lib/python3.9/site-packages/nvidia/__init__.py over existing file

どうやらRender.comではビルド環境にGPUがなくNVIDIA関連のパッケージインストール時にエラーが出ている様子。

# CPU版PyTorchを明示的にインストール(GPU環境なしのRender.com対応)
RUN pip install --index-url https://download.pytorch.org/whl/cpu torch torchvision

Dockerfileで明示的にCPU版PyTorchをインストールさせてあげることで解決できるとclaude codeが提案してくれた。poetryではなくpipでインストールするのは謎だが今回はとりあえず早く動作確認したいので受け入れる。
(自戒:どこかで必ずpoetryでの一元管理に修正する!!!!)

バタンヌバタンヌ

開発時に新たに覚えたこと

githubのPRがマージされたら紐づくissueも自動closeさせる方法

  • PRの説明欄にCloses #1, #2, #3のように紐付けたいissueを記載する。closesなどの文言に反応してくれているっぽい。

ブラウザのキャッシュを無視してサーバーから全部読み直したい時のショートカットキー

  • Cmd + Shift + R(Mac) / Ctrl + F5(Windows)
  • html,css,jsなどの静的ファイルを修正したが、ブラウザのキャッシュのせいで変更されていないという時に使える。
バタンヌバタンヌ

Google AdSenseやってみた

https://adsense.google.com/intl/ja_jp/start/?subid=ww-jp-ha-ads-g-a-srchd01_jp!o3&gad_source=1&gad_campaignid=22741932162&gbraid=0AAAAADjUaUdbJExtf3QD_tA3UpSTBXRoB&gclid=CjwKCAjw49vEBhAVEiwADnMbbHPwSW_V4ebGU_NGMgtqI-lToS627SwqDdrizVC925LvJnQCkJxeCRoCFTsQAvD_BwE

サイトに従って、ログイン→サイト登録→審査用スクリプトをhtmlに挿入→審査 まで実施済み

今は審査待ちの状態。数日から数週間かかるらしいので気長に待つとする。
落ちたら審査なしの広告も検討する。

バタンヌバタンヌ

審査待っている間にGoogle search consoleに登録してみる。

https://search.google.com/search-console/welcome?utm_source=about-page
所有権確認用の<meta>タグ埋め込んでデプロイ待ち。

Google search consoleについて

Google search consoleはサイトへのアクセス前のデータを取得して分析できるのが特徴。
SEO効果の検証や改善案の発見はもちろんのこと、流入検索キーワードを知ることで顧客や見込み顧客のニーズを発掘し、自分のサービスに対しての需要などを探ったり、必要なコンテンツを把握したりすることも可能になる。↓概要がわかりやすくまとまっていた。
https://satori.marketing/marketing-blog/google-search-console/

⇩<meta>タグについて

https://digital-marketing.jp/seo/what-is-metatag/

バタンヌバタンヌ

Googleのインデックスに登録されていなかった件

インデックスとはWEBサイトのクローラがインターネット上のリンクをクローリングして、発見した時にインデックスというGoogleのデータベースに登録する仕組みらしい。そこに登録されてやっと検索エンジンに引っかかるようになるらしい。新規サイトはすぐにはインデックスに登録されないらしいので気長に待つ。

とりあえず、Google search consoleでインデックスにリクエストもしてみる。以下を参考にした。
https://rank-quest.jp/column/column/index-registration/#Googleインデックス登録とは

バタンヌバタンヌ

Google AdSenseの審査落ちてた。。


具体的にはこの辺りのこの辺りの原因を深ぼっていくしかないが、一旦広告による収益化への深掘りは優先順位が低いので、調査はここまでにしておく。

本格的に個人開発していく時に調べていきたい。
今回はとりあえず学習用にデプロイしてみることが目的なのでここまでにしておく。

バタンヌバタンヌ

独自ドメインについても一旦いいかな。
やり方はわかったので、商用化しないのであれば無理に年額払って取得する必要はないかな。

このスクラップは27日前にクローズされました