Container StationでPi-Holeをセットアップする最適な方法

元々、Pi-Hole を QNAP がリストしている事前定義アプリを使って Container Station にセットアップしました。

ですが、これだと最新版が手に入らず、アップデートも面倒です。

最新バージョンの Pi-Hole を使ってコンテナを再構築しましたが、アップデートはやはり便利とは言えず、サーバーを再起動したりコンテナを再起動するたびにパスワードをリセットしなければなりません。最近 @Weedy さんのおかげで SimpleHelp を使った経験から、自分で Pi-Hole アプリケーションを作成し、ストレージを .qpkg ディレクトリ構造の外に設定することにしました。以下は QNAP が作成するアプリを元にした私の YAML コードです:


services:
  pihole:
    image: pihole/pihole:latest
    networks:
      qnet-network:
        ipv4_address: 192.168.1.4
    environment:
      WEBPASSWORD: *MyPassword*
      TZ: Chicago
    volumes:
      - /share/Container/pihole:/etc/pihole
      - etc-dnsmasq.d:/etc/dnsmasq.d
    restart: unless-stopped

networks:
  qnet-network:
    driver_opts:
      iface: eth3
    driver: qnet
    ipam:
      driver: qnet
      options:
        iface: eth3
      config:
        - subnet: 192.168.0.0/23
          gateway: 192.168.1.1

volumes:
  etc-dnsmasq.d:

いくつか問題があります:

1.) environment で設定した WEBPASSWORD が何もしていないようです。これは必要なパスワードではありません。

2.) ファイルを通常アクセスできるフォルダーに移動したにもかかわらず、起動するたびにパスワードをリセットしなければなりません。

3.) ここ数日、広告が表示され始め、Pi-Hole アプリケーションの動作が非常に遅いです。ウェブページが通常通り表示されず、今朝はパスワードをリセットしてもリセットされたことを認識しませんでした。ディスクに書き込みできていないような感じです。

何が間違っているのでしょうか?

コンテナにどのようなリソースを割り当てていますか?
CSでアプリを作成する際、「詳細設定」の「リソース」から設定できます。

無制限です。あなたと同じように。

アプリケーションログには何かエラーが表示されていますか?

また、テストとしてPi-hole推奨の設定値にリミットを設定してみることもできます。それが効果があるかは分かりませんが、私は通常、念のためリミットを無制限にはせず、アプリが問題を起こしてNASのリソースをすべて使い切り、NASがクラッシュするのを防ぐようにしています。

詳細にログを確認する必要がありますが、まだ行っていません。

自分のYAMLコードやアプリケーションのインストール方法に問題がないか、本当に気になっています。毎回起動するたびにパスワードをリセットしなくて済むようにしたいです。

いくつか試してみて、いくつかのことを行いました。
まず、ファイルをcompose.yamlに変換し、Container Stationアプリケーションの「作成」を使ってデプロイしました。リソースはCPU 2個、RAM 2GBに設定しました。
また、パスワードフィールドの名前がFTLCONF_webserver_api_passwordに変更されていたので、あなたのファイルで動作しなかった理由はそれです。

他のアプリと競合しないようにポートも変更しました。ネットワーク部分は動作させるために調整が必要かもしれません。

私はpiholeを運用していないので、数日後に失敗するかどうか負荷をかけて確認することはできません。

services:
  pi-hole:
    container_name: pihole-server
    image: pihole/pihole:latest
    stdin_open: true
    tty: true
    volumes:
      - /share/change to correct path/pihole:/etc/pihole
      - etc-dnsmasq.d:/etc/dnsmasq.d
    environment:
      FTLCONF_webserver_api_password: "test!test1"
      TZ: NewYork
    ports:
    - "753:53/tcp"
    - "753:53/udp"
    - "767:67/udp"
    - "780:80/tcp"
    - "7443:443/tcp"
volumes:
  etc-dnsmasq.d:

ありがとうございます。試してみます。

召喚されました……

marcoi さんが指摘した通り、あなたの compose.yaml はうまく動作していません。
おそらく QNAP が QNAP 独自のことをしていて、一般的なアップストリームリリースと互換性がないためでしょう。

まずはアップストリームの compose を探して、それを QNAP の docker で動かすために何を調整すべきか考えてみてください。


さて、pihole のようなアプリケーション/サービスについて前から疑問に思っていたのですが、NAT ってどうすればいいんでしょうか。
特に DNS 解決。やっぱり LAN IP が欲しいですよね?他の何も挟まないようにしたいし。

ということで @NA9D さん、テンプレートをインストールさせてくれてありがとう。QNAP についていくつか学べました。


OK、QNAP のデフォルトはこんな感じ

version: "3"

services:
  pihole:
    image: pihole/pihole:2022.12.1
    networks:
      qnet-network:
        ipv4_address: ${QNET_STATIC_IP}
    environment:
      WEBPASSWORD: ${WEB_PASSWORD}
      TZ: ${TZ}
    volumes:
      - etc-pihole:/etc/pihole
      - etc-dnsmasq.d:/etc/dnsmasq.d
    restart: unless-stopped

networks:
  qnet-network:
    driver_opts:
      iface: ${QNET_INTERFACE}
    driver: qnet
    ipam:
      driver: qnet
      options:
        iface: ${QNET_INTERFACE}
      config:
        - subnet: ${QNET_SUBNET}
          gateway: ${QNET_GATEWAY}

volumes:
  etc-pihole:
  etc-dnsmasq.d:

見ての通り、2022年リリースを明示的に指定しています。
あなたも marcoi さんも :latest を使っていましたが、どのタグが推奨なのか正直わかりません。私もよく :latest を使います。

これは正しいと仮定します

/share に何か設定したのに、なぜ名前付きマウントを使っているのでしょう?

2022年以降、設定オプションが変わっているのも納得です

これは DNS なので、後でいろいろ楽しめそうですね。

ということで docs.pi-hole.net を見に行きます

# 詳細は https://github.com/pi-hole/docker-pi-hole/ および https://docs.pi-hole.net/ を参照
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      # DNS ポート
      - "53:53/tcp"
      - "53:53/udp"
      # デフォルト HTTP ポート
      - "80:80/tcp"
      # デフォルト HTTPS ポート。FTL が自己署名証明書を生成します
      - "443:443/tcp"
      # Pi-hole を DHCP サーバーとして使う場合は下記をアンコメント
      #- "67:67/udp"
      # Pi-hole を NTP サーバーとして使う場合は下記をアンコメント
      #- "123:123/udp"
    environment:
      # タイムゾーンを設定
      # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 参照
      TZ: 'America/Chicago'
      # Webインターフェースのパスワードを設定。未設定の場合はランダムパスワードが割り当てられます
      FTLCONF_webserver_api_password: 'correct horse battery staple'
      # Docker のデフォルト bridge ネットワークの場合は dns listening mode を 'all' に
###      FTLCONF_dns_listeningMode: 'all'
    # ボリュームはコンテナアップグレード間でデータを保持します
    volumes:
      # Pi-hole のDBや設定ファイルを永続化
      - /share/Container/pihole/config:/etc/pihole
      # カスタム dnsmasq 設定ファイルを永続化したい場合は下記をアンコメント。Pi-hole v6 から始める場合は不要。v5 からアップグレードする場合は最初の v6 起動時のみ有効にし、移行後は削除可能。環境変数 FTLCONF_misc_etc_dnsmasq_d: 'true' が必要
      #- /share/Container/pihole/etc-dnsmasq.d:/etc/dnsmasq.d
    cap_add:
      # https://github.com/pi-hole/docker-pi-hole#note-on-capabilities 参照
      # DHCP サーバーとして使う場合のみ必要
      - NET_ADMIN
      # NTP クライアントとしてホストの時刻を設定する場合に必要
      - SYS_TIME
      # 任意。Pi-hole に処理時間を多く割り当てたい場合
      - SYS_NICE
    restart: always

うん、違いますね。2つ目のバインドマウントは省略できそうです。

でも、qnet-network のクソは残す必要がありそう。なので例えばこんな感じ……

# 詳細は https://github.com/pi-hole/docker-pi-hole/ および https://docs.pi-hole.net/ を参照
networks:
  qnet-network:
    driver_opts:
      iface: eth0
    driver: qnet
    ipam:
      driver: qnet
      options:
        iface: eth0
      config:
        - subnet: '10.0.0.0/24'
          gateway: '10.0.0.1'

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    networks:
        qnet-network:
            ipv4_address: '10.0.0.10'
    hostname: pihole
    ports:
      # DNS ポート
      - "53:53/tcp"
      - "53:53/udp"
      # デフォルト HTTP ポート
      - "80:80/tcp"
      # デフォルト HTTPS ポート。FTL が自己署名証明書を生成します
      - "443:443/tcp"
      # Pi-hole を DHCP サーバーとして使う場合は下記をアンコメント
      #- "67:67/udp"
      # Pi-hole を NTP サーバーとして使う場合は下記をアンコメント
      #- "123:123/udp"
    environment:
      # タイムゾーンを設定
      TZ: 'America/Chicago'
      # Webインターフェースのパスワードを設定。未設定の場合はランダムパスワードが割り当てられます
      FTLCONF_webserver_api_password: 'correct horse battery staple'
      # Docker のデフォルト bridge ネットワークの場合は dns listening mode を 'all' に
###      FTLCONF_dns_listeningMode: 'all'
      #### QNAP 用(docker 用の別ユーザーを使っています)
      PIHOLE_UID: 1000
      PIHOLE_GID: 1001
    # ボリュームはコンテナアップグレード間でデータを保持します
    volumes:
      # Pi-hole のDBや設定ファイルを永続化
      - /share/Container/pihole/config:/etc/pihole
      # カスタム dnsmasq 設定ファイルを永続化したい場合は下記をアンコメント。Pi-hole v6 から始める場合は不要。v5 からアップグレードする場合は最初の v6 起動時のみ有効にし、移行後は削除可能。環境変数 FTLCONF_misc_etc_dnsmasq_d: 'true' が必要
      #- /share/Container/pihole/etc-dnsmasq.d:/etc/dnsmasq.d
    cap_add:
      # https://github.com/pi-hole/docker-pi-hole#note-on-capabilities 参照
      # DHCP サーバーとして使う場合のみ必要
      - NET_ADMIN
      # NTP クライアントとしてホストの時刻を設定する場合に必要
      - SYS_TIME
      # 任意。Pi-hole に処理時間を多く割り当てたい場合
      - SYS_NICE
    restart: always

動きました!あとは頑張って @NA9D


@SteveKo driver: qnet の何がそんなに特別なんですか?これは単なる macvlan で、あなたたちは IPV6 を全部抜いたように見えます。それって正直微妙です :confused:

本当に IPV6 対応してほしいです。何とか動かすだけで疲れました。

つまり、@marcoi が追加したすべてのポート定義(753:53/tcp など)は、彼自身のテスト用であって通常の利用のためではありません。

ネットワーク関連は簡単です。コンテナをブリッジモードにしてNICに割り当て、IPアドレスを設定します。そうすれば特別なNATなどは必要ありません。だからネットワーク関連の設定を入れているんです。

一番大きな問題はコンテナ自体ではないかもしれません。最近毎朝 Pi-Hole の動作がとても遅くなっています。これは、深夜から午前7時までRAIDスクラビングをしているせいかもしれません。その原因を突き止める必要があります。

それと、なぜLANでIPV6が必要なんでしょうか?IPV4の方がずっとシンプルで、アドレスも実際に覚えられますよ! :smiley:

ポートについてはその通りです。他のアプリに影響が出ないように、念のため7つ追加しました。

こんにちは、本件については社内チームに報告済みで、Container Stationのバージョンに対するアップデートを予定しています。

ご利用中のDockerの問題についてですが、必要であればサポートチケットを作成してください。リモートで調査させていただきます。お力になれる方法を見つけられるかもしれません。

ありがとうございます!

私は個人的にはサポートチケットは必要ありません。
QTS/QuTS全体として、動作するIPV6が必要です。

多くのことを手動で回避してきましたが、まだ完璧ではありません。
なぜip6table_nat.koを手動でビルドしなければならないのですか?なぜdockerでipv6をブロックした状態で出荷するのですか?なぜip6tablesルール生成を強制的に無効化するのですか?

IPV6を修正してください。よろしくお願いします。

まったく同感です。IPv6が必要なコンテナはQNAPで使えないので、本当に困っています。

数年間、コンテナでPIholeを運用していて問題はありませんでした。しかし、今回はDHCPサーバーを使いたいと思っています。どうやらDHCPリクエストがコンテナに転送されていないようです。QnapのContainer Stationの実装では、そのようなポート67/68の転送設定が見当たりませんが、転送する方法はありますか?

DHCPサーバーを使用したい場合は、pi-Holeコンテナをブリッジモード(Bridge Mode)で設定し、DHCPプール外の新しい固定IPアドレスを割り当てる必要があります。QNAPが提供する「NAT」機能に頼ってコンテナLANにルーティングするのはおすすめしません。DHCPサーバーはLAN上に存在する必要があります。

こちらが私のComposeファイルです。ネットワーク設定はComposeで行っています。

services:
  pihole:
    image: pihole/pihole:latest
    networks:
      qnet-network:
        ipv4_address: 192.168.1.4
    environment:
      FTLCONF_webserver_api_password:
      TZ: America/Chicago
    volumes:
      - /share/Container/pihole:/etc/pihole
      - etc-dnsmasq.d:/etc/dnsmasq.d
    restart: unless-stopped

networks:
  qnet-network:
    driver_opts:
      iface: eth3
    driver: qnet
    ipam:
      driver: qnet
      options:
        iface: eth3
      config:
        - subnet: 192.168.0.0/23
          gateway: 192.168.1.1

volumes:
  etc-dnsmasq.d: