SynologyのNASにPostgreSQLをDockerで立てる方法【Container Manager】

Synology NAS

 

「常時起動しているNASにDBサーバーを立てられたら便利じゃないか」

そう思い立って、Synology DS720+ の Container Manager に PostgreSQL を立ててみました。ローカルのDockerと違い、NASなら24時間稼働なのでWebアプリのバックエンドDBとして使えます。

この記事では docker-compose.yml を使った構成で、ハマりポイントを含めて手順を解説します。

前提条件

ファイル構成

NAS上のディレクトリ構成は以下のようにします。

/volume1/docker/myapp/
├── Dockerfile          ← アプリ用(PostgreSQLだけなら不要)
├── docker-compose.yml  ← 今回の主役
└── data/
    └── postgres/       ← PostgreSQLのデータ永続化フォルダ

docker-compose.yml の書き方

services:
  postgres:
    image: postgres:16-alpine
    container_name: myapp-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: your_password_here
      PGTZ: Asia/Tokyo
    ports:
      - "15432:5432"
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    shm_size: '256mb'

ポイント解説

ports: "15432:5432"(重要)

Synology の DSM は内部で 5432 ポートを使用していることがあります。5432:5432 のままだとポートが競合して起動できません。外部向けのポートは 15432 など別の番号にしましょう。

TablePlus や DBeaver で接続するときは、ホスト側のポート 15432 を指定します。コンテナ内部のアプリ同士が通信する場合は Docker 内部ネットワーク経由なので 5432 のままで問題ありません。

PGTZ: Asia/Tokyo

タイムゾーンを日本時間に設定します。ログのタイムスタンプがJSTになるので設定しておくと後で助かります。

shm_size: '256mb'

PostgreSQL は共有メモリを使います。デフォルトの /dev/shm が小さいと大きなクエリで問題が出ることがあるので、明示的に設定しておきます。

restart: unless-stopped

NASを再起動したとき、コンテナが自動的に復帰します。手動で docker stop した場合は再起動しません。

デプロイ手順

STEP 1:NASにSSHで接続し、ディレクトリを作る

ssh username@192.168.x.x
mkdir -p /volume1/docker/myapp/data/postgres

STEP 2:データフォルダの権限を変更する(重要)

sudo chown -R 999:999 /volume1/docker/myapp/data/postgres

これを忘れると起動直後にコンテナが停止します。 PostgreSQL のコンテナは内部で UID 999 のユーザーが動作します。データフォルダのオーナーが root のままだと書き込めずにクラッシュします。

STEP 3:ファイルをNASに転送する

Macのターミナルから scp で転送します。

scp docker-compose.yml username@192.168.x.x:/volume1/docker/myapp/

STEP 4:Container Manager GUI でプロジェクトを起動する

Container Manager を開き、左メニューの「プロジェクト」→「作成」をクリックします。

① 全般設定

プロジェクト名とパスを入力します。パスは /docker/myapp のように指定します(/volume1 は不要です)。docker-compose.yml が自動検出されてプレビューが表示されたら「次へ」をクリックします。

プロジェクトを作成ダイアログの全般設定。プロジェクト名「myapp」、パス「/docker/myapp」、docker-compose.ymlの内容がプレビューされている

② Web ポータル設定

PostgreSQL は Web サービスではないので、チェックなしのまま「次へ」をクリックします。

Webポータル設定画面。「ウェブポータルをWeb Station経由でセットアップ」のチェックなしのまま次へ進む

③ 要約

設定内容を確認します。「プロジェクトが作成されると、開始されます。」にチェックが入っていることを確認して「完了」をクリックします。

プロジェクト作成の要約画面。プロジェクト名・パス・ソース・ファイルが確認できる

ビルドが始まり、ターミナルにログが表示されます。Container myapp-postgres StartedExit Code: 0 が表示されれば成功です。

ターミナル:構築 - myapp。Container myapp-postgres StartedとExit Code: 0が表示されている

プロジェクト一覧に戻ると、myapp の状態が ● (実行中)になっています。

Container Managerのプロジェクト一覧。myappが緑の●で実行中と表示されている

接続確認(TablePlus / DBeaver)

TablePlus で新しい接続を作成し、以下のように設定します。

項目 設定値
Host/Socket NASのローカルIPアドレス(例:192.168.x.x)
Port 15432
User myuser(docker-compose.yml で指定した値)
Password your_password_here
Database mydb

TablePlusのPostgreSQL接続設定画面。Host/SocketにNASのIPアドレス、Portに15432、UserにmyuserとDatabaseにmydbを入力した状態

「Connect」をクリックして接続できれば完了です。上部のバーに LOCAL | PostgreSQL 16.xx : myApp : mydb と表示されます。

TablePlusでNAS上のPostgreSQLに接続成功した画面。LOCAL | PostgreSQL 16.14 : myApp : mydbと表示されている

ハマりポイントまとめ

実際に詰まった点をまとめておきます。

症状 原因 対処
コンテナが起動直後に停止する データフォルダの権限不足 sudo chown -R 999:999 ./data/postgres を先に実行
ポート競合でコンテナが起動しない DSM が 5432 を使用中 ホスト側ポートを 15432 に変更
外部GUIツールから接続できない ポート番号の指定誤り TablePlus 等では 15432 を指定する

まとめ

NASにPostgreSQLを立てると、常時起動しているサーバーとして使えて非常に便利です。ハマりポイントは「データフォルダの権限」と「ポート番号の競合」の2点です。この2点さえ押さえておけば、あとはスムーズに動きます。

関連記事

コメント

タイトルとURLをコピーしました