Docker でのインストール(外部 Caddy)

この構成では、NocoBase アプリケーションコンテナと Caddy コンテナを分けて実行します。まず Docker でのインストール(内蔵 Nginx) を完了し、その後エントリを外部 Caddy コンテナへ切り替える形です。

この構成を使う場面

  • NocoBase と Web サーバーを分けて運用したい
  • Caddy でリバースプロキシや HTTPS 設定を簡単にしたい
  • 公開するのはプロキシコンテナだけにしたい

docker-compose.yml の例

full イメージが必要な場合は、latest-no-nginxlatest-full-no-nginx に置き換えてください。

13000:80 のマッピングは、ホストの標準ポートを直接使わずにローカルでテストしやすくするためのものです。本番環境では通常 13000:80 のままにはせず、外部 Caddy コンテナをホストの 80443 に直接マッピングします。

networks:
  nocobase:
    driver: bridge

services:
  app:
    image: nocobase/nocobase:latest-no-nginx
    restart: always
    depends_on:
      - postgres
    networks:
      - nocobase
    environment:
      - APP_KEY=your-secret-key
      - DB_DIALECT=postgres
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_DATABASE=nocobase
      - DB_USER=nocobase
      - DB_PASSWORD=nocobase
      - TZ=Etc/UTC
      - NOCOBASE_EXTRACT_CLIENT_ASSETS=true
      - NOCOBASE_PROXY_PROVIDER=caddy
      - NOCOBASE_PROXY_STORAGE_PATH=/app/nocobase/storage
      - NOCOBASE_PROXY_UPSTREAM_HOST=app
    volumes:
      - ./storage:/app/nocobase/storage

  caddy:
    image: caddy:2
    restart: always
    depends_on:
      - app
    networks:
      - nocobase
    volumes:
      - ./storage:/app/nocobase/storage
    command: >
      /bin/sh -c '
        while [ ! -f /app/nocobase/storage/.nocobase/proxy/caddy/nocobase.caddy ]; do
          echo "waiting for nocobase.caddy..."
          sleep 1
        done
        ln -sf /app/nocobase/storage/.nocobase/proxy/caddy/nocobase.caddy /etc/caddy/Caddyfile
        caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
      '
    ports:
      # これはローカルテスト用の例です。
      - "13000:80"
      # 本番環境では通常、次のように変更します。
      # - "80:80"
      # - "443:443"

  postgres:
    image: postgres:16
    restart: always
    command: postgres -c wal_level=logical
    environment:
      POSTGRES_USER: nocobase
      POSTGRES_DB: nocobase
      POSTGRES_PASSWORD: nocobase
    volumes:
      - ./storage/db/postgres:/var/lib/postgresql/data
    networks:
      - nocobase

重要なポイント

  • NOCOBASE_EXTRACT_CLIENT_ASSETS=true でクライアントアセットを抽出し、プロキシ設定を生成します
  • NOCOBASE_PROXY_PROVIDER=caddy で Caddy 用の設定を生成します
  • NOCOBASE_PROXY_UPSTREAM_HOST=app により、Caddy コンテナは Compose ネットワーク経由で app サービスへ接続します
  • ./storageappcaddy の両方にマウントし、プロキシ設定、静的アセット、アップロードファイルを共有できるようにします
  • caddy コンテナは nocobase.caddy が生成されるまで待機し、その後 ln -sf/etc/caddy/Caddyfile にリンクしてから起動します
  • 自動生成される設定は、APP_PUBLIC_PATH 配下の /files/ とルートの /files/ の両方を NocoBase に転送し、認証付きのファイルプレビューとダウンロードを処理します
  • ホストへ公開するのは Caddy コンテナのポートだけで十分です。テスト時は 13000:80 から始められますが、本番環境では通常ホストの 80443 を直接公開し、app サービスはホストへポートを公開する必要はありません

ホストにインストールした Caddy を使う場合

Caddy を Docker コンテナではなくホストに直接インストールしている場合は、別の docker-compose.yml を使うのがおすすめです。この構成では app サービスがホストへ直接ポートを公開し、プロキシ関連の環境変数もホスト視点の値にする必要があります。

次のような docker-compose.yml を使えます。

networks:
  nocobase:
    driver: bridge

services:
  app:
    image: nocobase/nocobase:latest-no-nginx
    restart: always
    depends_on:
      - postgres
    networks:
      - nocobase
    environment:
      - APP_KEY=your-secret-key
      - DB_DIALECT=postgres
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_DATABASE=nocobase
      - DB_USER=nocobase
      - DB_PASSWORD=nocobase
      - TZ=Etc/UTC
      - NOCOBASE_EXTRACT_CLIENT_ASSETS=true
      - NOCOBASE_PROXY_PROVIDER=caddy
      - NOCOBASE_PROXY_STORAGE_PATH=/path/to/your-project/storage
      - NOCOBASE_PROXY_UPSTREAM_HOST=127.0.0.1
      - NOCOBASE_PROXY_UPSTREAM_PORT=13000
    volumes:
      - ./storage:/app/nocobase/storage
    ports:
      - "13000:13000"

  postgres:
    image: postgres:16
    restart: always
    command: postgres -c wal_level=logical
    environment:
      POSTGRES_USER: nocobase
      POSTGRES_DB: nocobase
      POSTGRES_PASSWORD: nocobase
    volumes:
      - ./storage/db/postgres:/var/lib/postgresql/data
    networks:
      - nocobase

この構成では:

  • NOCOBASE_PROXY_STORAGE_PATH はホスト上の storage ディレクトリの絶対パスにします
  • NOCOBASE_PROXY_UPSTREAM_HOST127.0.0.1 にします
  • ローカル Caddy が 127.0.0.1:13000 経由でアプリへアクセスできるよう、app サービスは ports を残します

そのうえで、app コンテナ起動後に設定ファイルが生成されるのを待ち、ホスト側の Caddy 設定パスへリンクします。

while [ ! -f ./storage/.nocobase/proxy/caddy/nocobase.caddy ]; do
  echo "waiting for nocobase.caddy..."
  sleep 1
done

sudo ln -sf "$(pwd)/storage/.nocobase/proxy/caddy/nocobase.caddy" /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo systemctl reload caddy

ホスト側の Caddy が /etc/caddy/Caddyfile を使っていない場合は、リンク先を自分の設定パスに置き換えてください。通常は nocobase.caddy を主入口ファイルとしてそのまま使うほうが安全で、内容を手で分解してコピーするのはおすすめしません。

自動生成された設定を使わずに Caddy を自分で管理する場合は、/files/*APP_PUBLIC_PATH 配下の対応するルートを、SPA フォールバックルールより前で NocoBase に転送してください。完全な例は Caddy リバースプロキシを参照してください。

関連リンク