マテ茶を飲もう

ネットの海を泳いでも見つからなかった情報を残します

【完全無料】Oracle Cloudでdiscord.js botを常時ホストする方法

対象者

低スペックで構わないので、個人用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.puboracleの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

のようになるのを確かめる。

ローカルのファイルを移す

ローカルで行うこと

  1. 開発ディレクトリーで用いているnode.jsのバージョンを調べる。私が使っていた v16.20.2 はいつの間にかサポートが終了していたので、これを機にOracle Linuxが対応しているバージョンのうち最も新しいLTSである v18.20.2 に上げました。

  2. GitHubにpush(参考:githubでpushするまでの手順 #GitHub - Qiita)

クラウドサーバーで行うこと

  1. 上記インスタンスSSH接続

    ssh oracle-discord

  2. GitHubリポジトリーをクローン

    [opc@(インスタンスの名前) ~]$git clone https://github.com/~~~.git

  3. 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。

  4. ローカルと同じように実行し、必要なモジュールをインストール

    私の場合、環境変数を読み込むための dotenv モジュールが無いというエラーが出たので、npm install dotenvを実行して解決しました。

  5. foreverで常時起動

    サーバーとの接続を切ってもbotを動かし続けるため、foreverというデーモンを導入します。

    [opc@(インスタンスの名前) ~]$ npm install -g forever (グローバルオプション -g を忘れないように注意)

    インストール後、メインファイルが格納されているディレクトリーに移動し、startコマンドを実行します。

    [opc@(インスタンスの名前) ~]$ forever start index.js

    実行中のスクリプトの一覧や停止方法など:Node.jsのスクリプトをデーモン化する!

  6. 動作確認

    [opc@(インスタンスの名前) ~]$ exitでサーバーとの接続を切った後も、botがオンラインになっていれば成功です👏