「常時起動しているNASにDBサーバーを立てられたら便利じゃないか」
そう思い立って、Synology DS720+ の Container Manager に PostgreSQL を立ててみました。ローカルのDockerと違い、NASなら24時間稼働なのでWebアプリのバックエンドDBとして使えます。
この記事では docker-compose.yml を使った構成で、ハマりポイントを含めて手順を解説します。
前提条件
- Synology DS720+(DSM 7.3.2)
- Container Manager インストール済み(→ 前の記事:SynologyのNASにDocker環境を構築する方法)
- NASにSSH接続できる状態
ファイル構成
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 が自動検出されてプレビューが表示されたら「次へ」をクリックします。

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

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

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

プロジェクト一覧に戻ると、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 |

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

ハマりポイントまとめ
実際に詰まった点をまとめておきます。
| 症状 | 原因 | 対処 |
|---|---|---|
| コンテナが起動直後に停止する | データフォルダの権限不足 | sudo chown -R 999:999 ./data/postgres を先に実行 |
| ポート競合でコンテナが起動しない | DSM が 5432 を使用中 | ホスト側ポートを 15432 に変更 |
| 外部GUIツールから接続できない | ポート番号の指定誤り | TablePlus 等では 15432 を指定する |
まとめ
NASにPostgreSQLを立てると、常時起動しているサーバーとして使えて非常に便利です。ハマりポイントは「データフォルダの権限」と「ポート番号の競合」の2点です。この2点さえ押さえておけば、あとはスムーズに動きます。


コメント