0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UGREEN NAS + Docker で個人用Discord Botを無料で24時間稼働させる

0
Posted at

はじめに

個人利用のDiscord Botをサーバー上で動かそうとしたとき、月額プランに加入してまではやりたくないと思っていました。無償プランを探そうとしたときに、自宅にDockerを利用できそうなNASがあることを思い出したので、環境構築してみました。

今回はUGREEN NASync DXP4800 Plus上でDockerコンテナを動かす方法をまとめます。

前提条件

  • UGREEN NASなど、UGOS ProでDockerに対応したモデル)を使用していること
  • UGREEN NASのApp Centerから、Dockerをインストールしていること
  • SSHを有効化していること(コントロールパネル > ターミナル & SNMP からSSHを有効化)

お使いのUGREEN NASの機種がDocker対応かどうかは事前に確認してください。DXPシリーズは対応していますが、一部の廉価モデルは非対応の場合があります。

構成ファイルを用意する

Botを常駐プロセスとして動かすだけであればWeb公開ポートは不要なので、Dockerで動かすのが構成として一番シンプルです。以下の3ファイルを事前にアプリのフォルダに用意しておきます。

Dockerfile
# node:sqlite (Node.js組み込みSQLite) を使うため Node.js 22.5 以上が必要
FROM node:22-slim

WORKDIR /app

# 依存関係だけ先にコピーしてキャッシュを効かせる
COPY package.json package-lock.json* ./
RUN npm install --omit=dev

# アプリ本体をコピー
COPY src ./src

# 会話履歴(SQLite)の永続化先。docker-compose側でホストにマウントする想定
VOLUME ["/app/data"]

CMD ["node", "src/index.js"]

restart: unless-stopped を指定しておくことで、NAS再起動時にもBotが自動で復帰します。会話履歴用のフォルダはホスト側にマウントし、コンテナを作り直しても履歴が消えないようにしています。

docker-compose.yml
services:
  gemini-bot:
    build: .
    container_name: gemini-bot
    restart: unless-stopped
    env_file:
      - .env
    volumes:
      # NAS上の実フォルダに履歴(SQLite)を永続化する
      # 左側(ホスト側)のパスは実際のフォルダ構成に合わせて変更してください
      - ./data:/app/data

必要に応じて.dockerignoreを用意します。

.dockerignore
node_modules
data
.env
.git
.gitignore
*.log

デプロイ手順

  1. 共有フォルダを作成する
    UGOS Proの共有フォルダ作成画面から、例えば docker/gemini-discord-bot のようなフォルダを作成します。ここに Dockerfiledocker-compose.ymlpackage.jsonsrc フォルダ一式を配置します。
  2. ファイル一式をNASに転送する
    WindowsエクスプローラーでNASにネットワークドライブ接続し、フォルダごとドラッグ&ドロップするのが一番手軽です。SMB共有フォルダとしてエクスプローラー上に表示されます。
  3. .envを作成する
    同じフォルダ内に .env を新規作成し、DISCORD_TOKENGEMINI_API_KEYQUESTION_CHANNEL_ID、必要に応じて ALLOWED_ROLE_ID などを設定します。このファイルはGit管理対象外なので、NAS上に直接作成してOKです。
  4. SSHで接続する
    ssh [ユーザー名]@[NASのIPアドレス]のコマンドで接続します。
    作成した共有フォルダに移動します(例: cd /volume1/docker/gemini-discord-bot)。
  5. ビルド・起動する
    docker compose up -d --buildのコマンドで、Dockerにデプロイします。初回はイメージのビルドに数分かかります。完了後、docker compose logs -fのコマンドでログを確認します。「ログイン完了: (Bot名)」のようなログが出ていれば起動成功です。
  6. 動作確認する
    Discord上でBotに動作確認の投稿をしてみます。問題なければ、PCの電源を落としてもBotは動き続けます。さらにNAS自体が再起動しても、restart: unless-stopped の設定によりBotは自動で復帰します。

補足・注意点

  • システムディスクの余裕: DXPシリーズはシステムディスクにSSDを搭載しているモデルが多く、UGOS Proの起動やアプリ動作が安定しやすい傾向があります。軽量なBotコンテナを1つ動かす程度であれば、リソース的には問題ありません。
  • GUIでの起動も可能: SSH経由でのコマンド操作に抵抗がある場合、DockerアプリのGUI上にComposeの中身を直接貼り付けて起動する機能もあります。その場合は docker-compose.yml の内容をコピペし、環境変数はGUIの入力欄に入力すれば、コマンドラインなしでも運用できます。
  • データの保存先: 会話履歴(SQLite)用の data フォルダは、NASの一時領域やシステム領域ではなく、実ストレージ(RAIDボリューム)上に配置されるようにしましょう。共有フォルダ作成時に通常のボリュームを選んでいれば、特に意識する必要はありません。
  • gitが必要な場合: UGOS ProはDebianベースですが、NAS向けにカスタマイズされているため標準のAPTリポジトリが有効になっていません。NASのOS自体にパッケージを追加インストールするのはメーカーによっては非サポートになる場合があるため、gitが必要な場面ではNASのOSに直接インストールせず、Dockerコンテナ経由でgitコマンドを実行する方法に切り替えるのが安全そうです。

まとめ

UGREEN NAS(DXPシリーズ)のUGOS Proに標準統合されたDocker機能を使うことで、月額のホスティング費用をかけずに個人用Discord Botを24時間稼働させる環境を構築できました。Web公開ポートが不要な常駐プロセス用途であれば、Dockerでの運用が構成もシンプルで相性が良いと感じています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?