【1】HerokuからGCP無料枠にRailsアプリを引越ししたときにやったこと(GCE+Docker+Rails+Puma+PostgreSQL+Nginx+Let's Encrypt)
こんにちは。さくらです。
ポケット糖質量という Rails アプリを GCP(Google Cloud Platform)のサービスの一つであるGCE(Google Compute Engine)の無料枠を使って公開しました。
以前から Heroku のサーバーで公開していたのですが、この度お引越ししました。
そこで色々な手順を踏んだわけですが、知識不足で大変でしたので忘れてしまわないようにメモしておきます。
1. 前提
- Rails5.2 で作った web サイトを作成済み
- Heroku で公開済み(2017/4〜2019/2 まで)
- SSL 対応済
- 個人開発
2. 移転前(Heroku)の仕様
主な仕様 | 内容 |
---|---|
サーバー OS | heroku-16(Ubuntu 16.04) |
作業ステージ | production(Heroku), staging(Heroku), development(local)の3つ |
DB の種類 | production と staging は Heroku の PostgreSQL、development は SQLite3 |
Web サーバー | よくわからない(Heroku がうまいことやってくれていた) |
DNS サーバー | Heroku |
SSL 対応 | Automated Certificate Management という Heroku の機能で簡単 SSL&証明書自動更新 |
デプロイ方法 | Heroku Git を使ってソースコード push ですぐデプロイ |
料金 | Hobby プラン $7/Month |
3. 移転後(Google Compute Engine)の仕様
主な仕様 | 内容 |
---|---|
サーバー OS | GCE(Google Compute Engine) + Debian9 + Docker |
作業ステージ | production(GCE), development(local)の2つ |
DB の種類 | PostgreSQL のみ |
Web サーバー | Nginx |
DNS サーバー | お名前.com |
SSL 対応 | Let's Encrypt の証明書取得&自動更新出来るコンテナを使う |
デプロイ方法 | Github からコードを pull した後手作業で Docker Compose のコマンドでデプロイ |
料金 | 無料(〜数円) |
4. 移転の目的
Heroku のサーバー代が月$7 は別に高くないっちゃないんですが、他にもっと安い VPS もあるし GCP の無料枠なら安心感があるし、自分のサイトはリソースを必要とするようなものではないのでコストダウンすることを決めました。
無料で動的サイトをホスティングするのに GCP の他にArukasもありましたが、Docker Hub 上に保管されているパブリックリポジトリにのみ対応だったので候補から外しました。
その他の候補としてはWebARENA の VPS クラウド が月額 360 円~で良さそうでした。
人気のようで、契約したくても在庫切れの時があるらしいです。
その他に Docker を触ってみたいという欲求があり、いい機会だから始めることにしました。
これは純粋に興味本位です。Heroku のような運用でも困ったりはしていませんでした。
Dockerが必要になることもなかったですし。
5. 移転の感想
移転のためのあれこれを経験して一番良かったことは、これから他のサーバーを利用する時があっても自分でも利用できそうだという感覚がつかめたことです。
用語や手順など、Herokuではあまり考えてなかった部分も雰囲気がつかめたのではないでしょうか。
今後自分がサーバーをいじるとしたらコスパの良いVPSサーバーを借りる可能性が高いと思います。
それなら今回の引越しで行った工程は全て役に立つと思います。
一つ可能性が拓けたと考えてもよいのかなと思っています。
大変だったことは、既存のプロジェクトを Docker 化することです。
Dockerファイルの記述などはサンプルみたいに短いのに、書いて動くまでに時間がかかりました。
学習はそれなりに時間がかかり今も勉強中です。
でもサーバー移転をしようと決めたことがよいプレッシャーとなり、投げ出さなくてすみました。
Docker はまだ使いこなせているというレベルではないものの、サブ PC のSurface Goという 10 インチの Windows 機で MacBook と同じようにコンテナを起動出来た時は感動しました。
ローカルに Ruby さえインストールしなくても動くというか、OS レベルから同一の環境を用意出来ますもんね 。
それとVM インスタンス上にアプリを動かせるまで持っていくのにも、わからないことだらけで時間がかかりました。
途中もっと簡単に出来る方法は無いのか?と思ったりしましたが、それって Heroku じゃんと結局 Heroku の優しさが身にしみたりしました。
今も Heroku で Web を始めて本当によかったと思っています。
初めてアプリを作るのでも大変なのに、サーバー環境の構築なんて力尽きていたかもしれません。
Rails の勉強中に Heroku が良いと勧めてくれたRails チュートリアルに感謝してます。
もちろん Heroku にもすごく感謝してます!
6. 注意点
- この記事は初心者が初めて VPS サーバーを構築した記録のため冗長気味に書いてあります。わざわざ書くほどでもない当たり前のコマンドなども書いてあります。
- DockerでのDBの扱いに注意が必要です。
ポケット糖質量のデータは csv ファイルから投入すれば出来上がり、しかも ReadOnly なデータです。
ほとんどソースコードの一部のようなものなので、DB をコンテナの外に設定していません。
コンテナを消せば DB もすべて消えてしまいます。
ポケット糖質量独自の仕様によりこのような環境になっておりますので、参考にする時はご注意ください。 - GCPの無料枠を使っていますが、完全に無料にならないことがあります。下りのネットワーク1G以上だったりSSHポートへの攻撃で課金が発生したりすることがあります。
7. 作業手順
下記の関連リンクの順番に作業していきます。
大雑把な内容はこのようになります。
8. 関連リンク
- 【1】HerokuからGCP無料枠にRailsアプリを引越ししたときにやったこと(GCE+Docker+Rails+Puma+PostgreSQL+Nginx+Let's Encrypt)
- 【2】GCP(GCE)で無料のVMインスタンスを作る(Always Free無料枠、外部IPアドレス取得、SSH接続、22番ポート対応)
- 【3】GCEのVMインスタンスにDockerとDocker Composeをインストールする。他設定(スワップ領域追加、タイムゾーン設定)
- 【4】GCP(GCE)のVMインスタンスにファイルを転送する(Cyberduck, scpコマンド)
- 【5】GCP(GCE)でRailsアプリを外部IPアドレス+3000番ポートで動かしてみる(環境変数COMPOSE_FILE、GCE+Docker+Rails+Puma+PostgreSQL)
- 【6】DNSテスト用に無料の独自ドメインを取得してGoogle Cloud DNSでネームサーバの設定をする(GCE,freenom,http+独自ドメイン+ポート3000でアクセスする)
- 【7】SteveLTN/HTTPS-PORTALを使ってLet's Encryptで全自動SSL対応を行う(GCP(GCE),Rails,Nginxリバースプロキシ,Docker)