対象者
低スペックで構わないので、個人用botを動かせる完全無料サーバーを探している人。
2024年4月時点での簡単なホスト方法を記します。M2 MacBook Airで実行しました。
目次:
Oracle Cloudに登録
公式サイトから、手順に従って登録してください。
数年前はOracleのキャパ問題(?)によってアカウント申請が通りにくかった覚えがありますが、今回は一度で作成できました。
ただし、相変わらず Tokyo は Home Region として人気のようなので、一応 Japan Central (Osaka) を選びました。
SSH接続の準備
ターミナルを起動し、これから作成するoracleのサーバーにSSH接続するための鍵を生成しましょう。
例:
cd ~/.ssh ssh-keygen -t ed25519 -f oracle
※異なるディレクトリーで生成しても構いませんが、場所を覚えておいてください。
ls
コマンドの結果、oracle.pub
とoracle
の2ファイルが表示されることを確認して次に進みます。
コンピュートインスタンスを作成
Oracle Cloudにログインし、Launch resources --> Create a VM instance に移動します。
Image and Shape で、Always Free-eligible というタグがついているものを選択します。 本当は VM.Standard.A1.Flex を選びたかったんですが、キャパ不足のようなエラー(詳しくは覚えてない)が表示されてしまったので、VM.Standard.E2.1.Micro にしました。
次に、先ほど生成したSSH公開鍵oracle.pub
を登録します。
ターミナルで
cat ~/.ssh/oracle.pub | pbcopy
を実行し、クリップボードにコピーします。その後Oracleのページに戻り、Add SSH Keys --> Paste public keys に移動してペーストすればokです。
以上を終えたら、最低限の設定は完了です。
作成ボタンを押し、画面が遷移するのを待ちます。 遷移後の画面で、ステータスが RUNNING になれば完了です。 タブを開いたまま、次に進みます。
インスタンスにSSH接続・最低限の設定
先ほど生成したSSH鍵と、インスタンスの詳細ページに表示されているPublic IP address(赤塗り部分)、その下のusernameを用います。
生成直後のusernameは全員共通でopc
のようです。
ターミナルで以下のコマンドを打ちます。
ssh -i ~/.ssh/oracle opc@(public ip address)
その結果、以下のような表示になれば接続できています。
[opc@(インスタンスの名前) ~] $
これは任意ですが、接続の度に秘密鍵の場所やIPアドレスを入力するのは面倒なので、SSHの設定ファイル(大抵~/.ssh/config
)に以下を追記すると楽になります。
Host (任意の名前。例:oracle-discord) HostName (上記IPアドレス) User opc IdentifyFile ~/.ssh/oracle
上記のように設定すると、ssh oracle-discord
と入力するだけでインスタンスに接続できます。
次に、SSH接続した状態で最低限の設定変更を行います。
タイムゾーンの変更
おそらく、初期状態では日本標準時(JST)ではなくグリニッジ標準時(GMT)に設定されています。
[opc@(インスタンスの名前) ~]$ date
の結果に、JST
ではなくGMT
が表示されている場合、以下のコマンドでタイムゾーンを変更しましょう。
[opc@(インスタンスの名前) ~]$ sudo timedatectl set-timezone Asia/Tokyo
その後、上記のdate
コマンドを実行し、GMT
ではなくJST
と表示されていることを確認します。
日本語パックのインストール
[opc@(インスタンスの名前) ~]$ localectl status
の結果がLANG=ja_JP.utf8
になっていない場合、以下の流れに沿ってロケールを日本語に設定しましょう。
[opc@(インスタンスの名前) ~]$ sudo yum install glibc-langpack-ja
↓途中でy Enter
、Complete! と表示されるまで数分待つ
[opc@(インスタンスの名前) ~]$ sudo localectl set-locale LANG=ja_JP.utf8
再度localectl status
を実行し、LANG=ja_JP.utf8
が表示されていればOKです。
gitをインストール
[opc@(インスタンスの名前) ~]$ sudo yum install git-all
[opc@(インスタンスの名前)~]$ git -v git version 2.39.3
のようになるのを確かめる。
ローカルのファイルを移す
ローカルで行うこと
開発ディレクトリーで用いているnode.jsのバージョンを調べる。私が使っていた v16.20.2 はいつの間にかサポートが終了していたので、これを機にOracle Linuxが対応しているバージョンのうち最も新しいLTSである v18.20.2 に上げました。
GitHubにpush(参考:githubでpushするまでの手順 #GitHub - Qiita)
クラウドサーバーで行うこと
-
ssh oracle-discord
-
[opc@(インスタンスの名前) ~]$git clone https://github.com/~~~.git
node.jsとnvmをインストール
まず、oracleの公式サイトでnode.jsの対応表を見ます。 2024年4月時点では、v18.x までのみ対応しているようです(node.js自体の最新LTSは v20.12.2)。
公式サイトに沿ってインストールしても良いですが、いずれnvm(Node Version Manager)が必要になるので、
まずはnvmをインストール→指定バージョンのnode.jsをインストール
という順番で進めます(参考: How to Install Node.js and NPM on Oracle Linux | Atlantic.Net )。
nvmのインストール:
[opc@(インスタンスの名前) ~]$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
[opc@(インスタンスの名前) ~]$ source ~/.bashrc
[opc@(インスタンスの名前) ~]$ nvm -v
の結果、0.39.7
のように表示されればOK。node.jsのインストール:
[opc@(インスタンスの名前) ~]$ nvm ls-remote
でインストール可能なバージョン一覧を確認。v18.20.2をインストールする場合↓[opc@(インスタンスの名前) ~]$ nvm install 18
[opc@(インスタンスの名前) ~]$ nvm use 18
[opc@(インスタンスの名前) ~]$ node -v
の結果、v.18.20.2
と表示されればOK。ローカルと同じように実行し、必要なモジュールをインストール
私の場合、環境変数を読み込むための dotenv モジュールが無いというエラーが出たので、
npm install dotenv
を実行して解決しました。foreverで常時起動
サーバーとの接続を切ってもbotを動かし続けるため、foreverというデーモンを導入します。
[opc@(インスタンスの名前) ~]$ npm install -g forever
(グローバルオプション -g を忘れないように注意)インストール後、メインファイルが格納されているディレクトリーに移動し、startコマンドを実行します。
[opc@(インスタンスの名前) ~]$ forever start index.js
実行中のスクリプトの一覧や停止方法など:Node.jsのスクリプトをデーモン化する!
動作確認
[opc@(インスタンスの名前) ~]$ exit
でサーバーとの接続を切った後も、botがオンラインになっていれば成功です👏