メインコンテンツへスキップ
見出し画像

VPSサーバー×Remote-SSH完全ガイド - VSCodeからの接続と一般ユーザー設定方法【競馬AI開発#27】

    今回は、開発したシステムを安定運用するために欠かせない「VPSサーバー」の導入方法について詳しく解説していきます。

    VPSサーバーって何?なぜ必要なの?

    VPS(Virtual Private Server)サーバーとは、1台の物理サーバーを分割してそれぞれを独立したサーバーとして利用できるサービスです。
    イメージとしては「24時間稼働できるPCを月額1000円程度でレンタルできるサービス」のようなものです。

    では、なぜVPSサーバーが必要なのでしょうか?

    1. 接続の安定性を確保できる
      VPSサーバーを使わずに、プログラムをローカルPC(手元のパソコン)で動かしている場合、PCの電源を切れば処理が止まってしまううえ、インターネット接続が不安定になると実行中のタスクが中断されてしまうと思います。
      一方、VPSサーバーは手元のPCの状態に関わらず常時安定稼働させることができます。そのため、作業内容やタスクが途中で止まってしまうリスクを大幅に減らすことができます。

    2. 必要に応じたリソース拡張ができる
      スペックを上げたい場合、ローカルPCではCPUやメモリやストレージの増設など物理的に対応する必要があります。
      一方、VPSサーバーであれば必要なときにプランをアップグレードし、CPUコア数やメモリ容量を簡単に増やすことが可能です。また、ディスク容量を増やしたいときも、オンラインで拡張手続きを行えることがほとんどです。

    3. 外部からのアクセスができる
      ローカルPCにプログラムを置いて運用する場合、自宅やオフィスなど特定の場所からしかアクセスできません。また、外部ネットワークからの接続を設定すると、セキュリティ面の考慮などが複雑になります。
      一方、VPSサーバーであれば、インターネット上に常時接続された環境が手に入るため、どこにいてもサーバーへアクセスが可能です。チーム開発であっても、メンバーが別々の拠点から同一の環境にアクセスしやすくなるため、共同作業が飛躍的に効率化します。

    例えば、この【競馬AI開発】シリーズで開発しているシステムであれば、以下のようなステップでシミュレーション用のレース直前オッズデータを取得しようとしています。

    • レース開催日の朝にスクリプトを起動

    • 各レースの発走5分前から、1分間隔でオッズ情報をスクレイピング

    • 取得したデータをストレージに保存

    このような処理をVPSサーバー上で実行することで、ローカルPCの状態に関係なく、安定した運用が可能になります。また、将来的な自動投票システムの実装も視野に入れると、安定稼働できる実行環境として、VPSサーバーは有力な選択肢となります。

    VPSサーバーの初期設定・使い方

    ここからの内容は、動画の2:44〜でも解説しています。

    ConoHa VPSからサーバーを借りる

    VPSサーバーのレンタルサービスには様々なサイトがありますが、今回はConoHa VPSを使った方法を紹介します。
    会員登録がまだの方は、以下のサイトから会員登録をしましょう。

    ログインすると、以下のようなサイドパネルがあるトップページに入ります。
    ここから「サーバー追加」を押して早速サーバーを借りていきましょう。

    画像

    サービスは「VPS」を選択、イメージタイプは、ここでは「Debian」を選択します。

    画像

    料金タイプ・プランは一旦デフォルトのもので良いでしょう。
    rootパスワードを入力したら、「オプションを見る」をクリックします。

    画像

    まずは、セキュリティグループを「IPv4v6-SSH」に設定します。
    VSCodeからSSH接続するのに必要な設定となるので、忘れずに設定しておきましょう。(自分はこの設定を忘れていて、苦戦してしまいました…)

    「キーを新規作成」を選択して「追加」を押すとSSHキーがダウンロードされます。

    画像

    設定や料金を確認し、「追加」を押すとサーバーの構築が始まります。

    画像

    少し待ってページを更新すると、新しく追加したサーバーのステータスが「起動中」になっていることが確認できます。

    画像

    【注意】
    ・IPアドレスは外部に公開しないようにしましょう。これはサーバーの「住所」のようなものであり、セキュリティ上重要な情報です。
    ・「時間課金」モードの場合、起動中はプランに応じた課金が発生するので、使わない時はシャットダウンしてサーバーを停止しておきましょう。

    SSHキーの配置

    次にダウンロードしたSSHキーを、ホームディレクトリの.ssh/に配置します。

    【Macの場合】
    ▼ターミナルで実行
    (.pemのファイル名は、先ほどダウンロードしたものに変えてください。)

    mv ~/Downloads/key-2025-01-29-20-59.pem ~/.ssh/
    chmod 600 ~/.ssh/key-2025-01-29-20-59.pem

    このchmodは「番号が大きくなるほど制限が甘い」ことを意味していて、600に設定することで、「他人が中身を見たり書き換えたりできないようにするために、ファイル所有者だけがアクセスできる」状態にしています。(これも設定しないと、ssh接続の際にエラーになります)

    【Windowsの場合】
    ▼ターミナル(コマンドプロンプトやpower shell)で実行

    move C:\Users\ユーザー名\Downloads\key-2025-01-29-20-59.pem C:\Users\ユーザー名\.ssh\

    WindowsのファイルシステムはLinuxのようなUNIXパーミッションを持たないため、通常、Windows上で.pemファイルに対して「chmod 600」を実行する必要はないようです。

    Remote-SSHによるVSCodeからの接続

    VSCodeには、公式の「Remote-SSH」という拡張機能が用意されています。これを導入することで、VSCodeから直接SSH接続してVPS上のファイルをローカル感覚でVSCode上から編集可能になります。

    まずは、VSCodeの拡張機能からremote-sshをインストールします。

    画像

    そうすると、Remote Explorerアイコンが現れるのでクリックし、SSHの設定で「New Remote」の+ボタンを押して新しい接続を作っていきます。

    画像

    先ほど作ったサーバーのIPアドレスをコピーし、root@{IPアドレス}を入力します。

    画像

    以下の歯車マークを押すと、

    画像

    configファイルを選択する画面が上部に出てくるので、/Users/ユーザー名/.ssh/configを選択します。

    画像

    configファイルが開くので、

    • Host: 好きな名前を設定する

    • HostName: 作成したVPSサーバーのIPアドレス

    • IdentityFile: 先ほどダウンロードしてコピーした.pemファイル

    にそれぞれ設定します。

    ▼/Users/ユーザー名/.ssh/config

    Host conoha_root
      HostName xxx.xxx.xxx.xxx
      User root
      IdentityFile ~/.ssh/key-2025-01-29-20-59.pem

    Refreshボタンを押すと、

    画像

    作成したHostNameが現れるので、→ボタンを押すと(もしくはその右のボタンを押すと新しいウィンドウで開きます)、

    画像

    以下のように、SSH: conoha_rootと表示されたウィンドウが開きます。

    画像

    これで、VSCode上からVPSのサーバーに入ることができました。

    VPSに一般ユーザーを追加してログイン

    ここからの内容は、動画の9:22〜でも解説しています。

    VPSを借りた直後はrootユーザーでのログインが可能ですが、root権限はサーバー全体を操作できるため、万一不正アクセスされると被害が甚大となってしまいます。そこで一般ユーザーを作成し、普段はこちらでログインする運用が推奨されています。

    まずは、一般ユーザーを作成しましょう。VPS上のターミナルで、以下のコマンドを実行します。

    ▼ターミナル(VPS上)

    adduser {設定したいユーザー名}

    例えば、keibaという名前のユーザーを追加すると、以下のようになります。

    adduser keiba
    Adding user `keiba' ...
    Adding new group `keiba' (1000) ...
    Adding new user `keiba' (1000) with group `keiba (1000)' ...
    Creating home directory `/home/keiba' ...
    Copying files from `/etc/skel' ...
    New password:

    パスワードの入力を2回求められるので、入力します。

    
    Retype new password: 
    passwd: password updated successfully
    Changing the user information for keiba
    Enter the new value, or press ENTER for the default
            Full Name []: 
            Room Number []: 
            Work Phone []: 
            Home Phone []: 
            Other []: 
    Is the information correct? [Y/n] Y
    Adding new user `keiba' to supplemental / extra groups `users' ...
    Adding user `keiba' to group `users' ...

    次に、追加したkeibaユーザーをsudoグループに追加します。sudoとは一般ユーザーが一時的に管理者(root)権限でコマンドを実行するための仕組みです。

    sudo adduser keiba sudo

    これによって、keibaユーザーでも管理者権限が必要なコマンドを一時的に実行することができます。

    次に、作成したユーザーのホームディレクトリ(/home/keiba/)配下に.ssh ディレクトリを作成し、適切な権限を設定します。

    mkdir -p /home/keiba/.ssh
    chmod 700 /home/keiba/.ssh

    一度ローカル上のターミナルに戻り、以下のコマンドを実行して一般ユーザー用のSSHキーを作成します。

    【Macの場合】
    ▼ターミナル(ローカルPC上)

    ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa_keiba

    "id_rsa_keiba"の部分は、好きな名前で構いません。

    【windowsの場合】
    ▼ターミナル(ローカルPC上)

    ssh-keygen -t rsa -b 2048 -f C:\Users\ユーザー名\.ssh\id_rsa_keiba

    すると、.ssh/配下にid_rsa_keiba.pubとid_rsa_keibaという二つのファイルができます。これらはそれぞれ「公開鍵」「秘密鍵」と呼ばれるもので、この二つの鍵を照合することでサーバーに接続するのが「SSH接続」という仕組みになります。

    • id_rsa_keiba.pub:公開鍵(サーバー側に登録)

    • id_rsa_keiba:秘密鍵(クライアント側に登録)

    よって、まずは公開鍵であるid_rsa_keiba.pubをサーバー側に/home/{ユーザー名}/.ssh/authorized_keysという名前でコピーします。

    サーバーに接続した方のウィンドウで「Open Folder」から、先ほど作成した/home/keiba/.ssh/に入ります。

    画像

    先ほど作成した、id_rsa_keiba.pubファイルをドラッグしてコピーすることができます。

    画像

    あとはファイル名をauthorized_keysに書き換えます。

    画像

    次に、そのままサーバー上で以下のコマンドを実行します。

    ▼ターミナル(VPS上)

    chown -R keiba:keiba /home/keiba/.ssh/
    chmod 600 /home/keiba/.ssh/authorized_keys

    chown は “change owner” の略で、ファイルやディレクトリの所有者を変更するコマンドです。

    .ssh ディレクトリや中のファイルが、他のユーザーやルート(root)ユーザーなどの所有になっていると、SSHサーバー側で「適切なユーザーが所有していない=安全性に問題がある」と見なされ、キー認証を弾くことがあります。
    そのため、必ず鍵を利用するユーザー自身が.sshディレクトリとその中身を所有している状態にする必要があり、それを実現するのがこの chown コマンドです。

    再びsshの設定(config)ファイルを開き、一般ユーザー用の接続情報を追加します。

    • Host: 好きな名前

    • HostName: 接続先IPアドレス(先ほどと同じ値)

    • User: 先ほどサーバー上で作成したユーザー名

    • IdentityFile: 先ほど作成した秘密鍵

    ▼/Users/ユーザー名/.ssh/config

    Host conoha_root
      HostName xxx.xxx.xxx.xxx
      User root
      IdentityFile ~/.ssh/key-2025-01-29-20-59.pem
    
    Host conoha_keiba
      HostName xxx.xxx.xxx.xxx
      User keiba
      IdentityFile ~/.ssh/id_rsa_keiba

    更新すると接続ボタンが出現するので、これで一般ユーザーとしてサーバーに入っていきます。

    画像

    パスワードの入力を求められるので、先ほど鍵を作成するときに決めたパスワードを入力します。

    画像

    うまくいくと接続することができ、以下のように$マークのターミナルが現れます。

    [keiba@vm-20131503-5d ~]$ 

    一般ユーザーのターミナルは$、rootユーザーのターミナルは#が表示されるようになっています。

    rootユーザーでのログインを禁止

    一般ユーザーで接続できることを確認したら、次にrootユーザーでログインできないように設定していきます。

    再びrootユーザーでログインして、/etc/ssh/に入ります。
    この中の、sshd_configというファイルを開き、以下の2行をnoに設定します。

    • PermitRootLogin no: rootユーザーでのログインを禁止する

    • PasswordAuthentication no: パスワード認証でのログインを禁止する(=接続方法をssh認証に限定する)

    ▼/etc/ssh/sshd_config(VPS上)

    # Authentication:
     #LoginGraceTime  2m
    PermitRootLogin no
    
    # 省略
    
    # To disable tunneled clear text passwords, change to no here!
    PasswordAuthentication no

    設定したら、以下のコマンドで設定を反映させます。

    ▼ターミナル(VPS上)

    sudo systemctl restart ssh

    一度ウィンドウを閉じて接続を切り、rootユーザーで入り直そうとすると、以下のように弾かれることが分かります。

    画像

    以上でsshの設定は完了となります。

    VPSサーバーにPython環境を構築する

    ここからの内容は、動画の19:06〜でも解説しています。

    次に、Pythonを使えるように環境構築していきます。
    再び一般ユーザーでサーバーに接続し、以下のコマンドを実行してLinuxパッケージをアップデートします。

    ▼ターミナル(VPS上)

    sudo apt update && sudo apt upgrade -y

    次に、VSCodeのPython用拡張機能を導入します。

    画像

    検索窓で以下の拡張機能を検索し、「Install in SSH」で導入します。

    • Python(必須)

    • Jupyter(必須):VSCode上でノートブック形式(.ipynb)の編集、実行

    • Pylance(任意):変数や関数の定義元参照・リファクタリング機能

    • Flake8:推奨コーディングスタイルに違反したときに知らせてくれる

    • isort:インポート文を自動整列

    • Black Formatter:コードフォーマットを自動で統一する

    • GitHub Copilot:生成AIによるコード補完

    次に「Open Folder」からホームディレクトリ(/home/keiba)を開きます。

    画像

    この中に、まずはPythonプロジェクト用のディレクトリを作成しましょう。「New Folder」から、例えば「pyproject」という新しいフォルダを作ります。

    画像
    画像

    または、本記事有料部分の「ソースコードのダウンロード」に添付されているソースコードを解凍し、keibaAI-v3/フォルダをVPS上の/home/keiba/配下にドラッグしてコピーしてください。

    次に、Pythonの仮想環境を今作成したフォルダの配下に作りたいので、Open Folderでウィンドウを開き直し、/home/keiba/pyproject(購入者であれば/home/keiba/keibaAI-v3)を選択します。

    画像
    画像

    仮想環境とは、プロジェクトごとに独立したPython環境を作る仕組みです。
    ライブラリのバージョンや依存関係を他のプロジェクトと分離できるので、特定のプロジェクトだけ古いバージョンを使いたいとき、あるいは複数プロジェクトで異なるバージョンのライブラリが必要なときでも互いに影響を受けずに開発できます。

    「New File」ボタンからrequirements.txtを作成し、例えば以下のようなライブラリを記載してみます。(keibaAI-v3/にはすでに入っています)

    画像

    ▼requirements.txt

    lightgbm==4.5.0
    matplotlib==3.8.2
    numpy==1.26.4
    pandas==2.2.2
    scikit_learn==1.4.0

    次に同じ手順でdev.ipynbを作成し、右上の「Select Kernel」から「Python Environment」を選択します。(購入者の場合は、keibaAI-v3/src/dev.ipynbにあります)

    画像

    Create Python Environmentを選択し、

    画像

    Python 3.11.2→ requirements.txtでOKを押します。

    画像

    これで、 requirements.txtに記載されたライブラリがインストールされたPythonの仮想環境を自動的に構築してくれます。

    画像
    画面下部のOUTPUTでログが確認できる

    完了すると、.venvという仮想環境が構築されていることが確認できます。

    画像
    画像

    これで、VPSサーバー上でも、ローカルと同じようにnotebook上でPython実行できるようになっています。

    画像
    dev.ipynbでの実行例

    ターミナルにも(.venv)と表示されており、仮想環境の中に入っていることが分かります。

    (.venv) keiba@vm-{id}:~/keibaAI-v3-yt$

    もし表示されていない場合は、

    source .venv/bin/activate

    で仮想環境をONにできます。

    VPSサーバー上で直前オッズのスクレイピングを実行する

    ここからは、今回のVPS導入目的であった「シミュレーション用の直前オッズ取得・蓄積システム」を完成させていきます。

    ■完成イメージ
    開催日当日に、サーバー上で

    nohup python3 execute.py --kaisai_date YYYYMMDD &

    コマンドを実行し、放置しておくことで、JRA公式サイトの全馬券種の直前オッズ情報が下記のようにhtmlとして蓄積されていきます。

    画像

    【メリット】
    ・時系列オッズビュワーなどで取得できないワイド・三連単・三連複も含む ・取得間隔も自在にコントロール可能

    取得の様子やエラーの情報は、以下のようなlogファイルに残ります。

    [2025-02-16 00:46:03] INFO: Scraping time table at 20250216...
    [2025-02-16 00:46:13] INFO: Time table:
         race_id     title post_time
    202505010601     3歳未勝利     10:05
    202505010602     3歳未勝利     10:35
    202505010603      3歳新馬     11:05
    202505010604   3歳1勝クラス     11:35
    202505010605     3歳未勝利     12:25
    202505010606 4歳以上1勝クラス     12:55
    202505010607 4歳以上1勝クラス     13:25
    202505010608 4歳以上2勝クラス     13:55
    202505010609       雲雀S     14:25
    202505010610    バレンタイン     15:00
    202505010611     共同通信杯     15:45
    202505010612 4歳以上2勝クラス     16:25
    202508010601     3歳未勝利     09:55
    202508010602      3歳新馬     10:25
    202508010603     3歳未勝利     10:55
    202508010604   3歳1勝クラス     11:25
    202508010605     3歳未勝利     12:15
    202508010606     3歳未勝利     12:45
    202508010607 4歳以上1勝クラス     13:15
    202508010608 4歳以上1勝クラス     13:45
    202508010609      春日特別     14:15
    202508010610       北山S     14:50
    202508010611      京都記念     15:30
    202508010612 4歳以上2勝クラス     16:10
    202510010801     3歳未勝利     09:45
    202510010802     3歳未勝利     10:15
    202510010803 4歳以上1勝クラス     10:45
    202510010804 4歳以上障害未勝利     11:15
    202510010805     3歳未勝利     12:05
    202510010806 4歳以上1勝クラス     12:35
    202510010807 4歳以上1勝クラス     13:05
    202510010808 4歳以上1勝クラス     13:35
    202510010809      大濠特別     14:05
    202510010810     伊万里特別     14:40
    202510010811    北九州短距離     15:15
    202510010812 4歳以上1勝クラス     16:00
    [2025-02-16 00:46:13] WARNING: /etc/timezone is deprecated on Debian, and no longer reliable. Ignoring.
    [2025-02-16 09:40:20] INFO: Scraping odds from JRA at 202510010801...
    [2025-02-16 09:41:20] INFO: Scraping odds from JRA at 202510010801...
    [2025-02-16 09:42:20] INFO: Scraping odds from JRA at 202510010801...
    [2025-02-16 09:43:20] INFO: Scraping odds from JRA at 202510010801...
    [2025-02-16 09:44:20] INFO: Scraping odds from JRA at 202510010801...
    [2025-02-16 09:45:20] INFO: Scraping odds from JRA at 202510010801...
    [2025-02-16 09:46:20] INFO: Scraping odds from JRA at 202510010801...
    [2025-02-16 09:50:20] INFO: Scraping odds from JRA at 202508010601...

    ソースコードのダウンロード

     
     
    競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っていきます。

    あなたへのおすすめ