はじめに
個人利用の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ファイルを事前にアプリのフォルダに用意しておきます。
# 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が自動で復帰します。会話履歴用のフォルダはホスト側にマウントし、コンテナを作り直しても履歴が消えないようにしています。
services:
gemini-bot:
build: .
container_name: gemini-bot
restart: unless-stopped
env_file:
- .env
volumes:
# NAS上の実フォルダに履歴(SQLite)を永続化する
# 左側(ホスト側)のパスは実際のフォルダ構成に合わせて変更してください
- ./data:/app/data
必要に応じて.dockerignoreを用意します。
node_modules
data
.env
.git
.gitignore
*.log
デプロイ手順
- 共有フォルダを作成する
UGOS Proの共有フォルダ作成画面から、例えばdocker/gemini-discord-botのようなフォルダを作成します。ここにDockerfile、docker-compose.yml、package.json、srcフォルダ一式を配置します。 - ファイル一式をNASに転送する
WindowsエクスプローラーでNASにネットワークドライブ接続し、フォルダごとドラッグ&ドロップするのが一番手軽です。SMB共有フォルダとしてエクスプローラー上に表示されます。 - .envを作成する
同じフォルダ内に.envを新規作成し、DISCORD_TOKEN、GEMINI_API_KEY、QUESTION_CHANNEL_ID、必要に応じてALLOWED_ROLE_IDなどを設定します。このファイルはGit管理対象外なので、NAS上に直接作成してOKです。 - SSHで接続する
ssh [ユーザー名]@[NASのIPアドレス]のコマンドで接続します。
作成した共有フォルダに移動します(例:cd /volume1/docker/gemini-discord-bot)。 - ビルド・起動する
docker compose up -d --buildのコマンドで、Dockerにデプロイします。初回はイメージのビルドに数分かかります。完了後、docker compose logs -fのコマンドでログを確認します。「ログイン完了: (Bot名)」のようなログが出ていれば起動成功です。 - 動作確認する
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での運用が構成もシンプルで相性が良いと感じています。