本文へ移動

Docker Compose でデプロイ

現在のネットワークに適したイメージソースを選び、完全な Compose 設定を使用して、Linux ホストまたは Linux ベースの NAS で fn-knock を実行します。

元の Docker Hub ページを開く

イメージソース

イメージソースイメージ推奨ネットワーク
公式ミラーhub.fnknock.cn/kcilnk/fn-knock:latest中国本土のネットワーク。latest は 30 分ごとに同期
Docker Hubkcilnk/fn-knock:latestDocker Hub に安定して接続できるネットワーク

以下では公式ミラーを使用します。ソースを切り替える場合は、pull コマンドと .envFN_KNOCK_IMAGE を対応するアドレスに変更してください。バージョンを固定する場合は、latest を公開済みの固定タグに変更します。

ネットワークモード

ネットワークモード推奨説明
HOST ネットワーク推奨・既定ホストネットワークを直接使用し、実際のインターフェイスと IPv6 を認識できます
ブリッジネットワーク任意分離されたデュアルスタック bridge とポートマッピングを使用しますが、DDNS がホストのインターフェイスや IPv6 を検出できない場合があります

DDNS の「インターフェイスから取得」を使用する場合や、ホスト IPv6 に依存する場合は HOST ネットワークを使用してください。ブリッジは、ホストインターフェイスの検出よりもネットワーク分離を優先する場合に選択します。

一括インストール

対象 Linux ホストの root ターミナルへ以下のスクリプト全体を貼り付けます。既定では推奨の HOST ネットワークを使用し、完全な Compose 設定を書き込んで fn-knock を起動します。

bash
sh <<'FN_KNOCK_INSTALL'
set -eu

if [ "$(id -u)" -ne 0 ]; then
  echo "Please run this installer in a root terminal." >&2
  exit 1
fi

command -v docker >/dev/null 2>&1 || { echo "Docker is not installed." >&2; exit 1; }
docker compose version >/dev/null 2>&1 || { echo "Docker Compose is not available." >&2; exit 1; }

install_dir=/opt/fn-knock-docker
mkdir -p "$install_dir"
cd "$install_dir"

if [ -e .env ] || [ -e docker-compose.yml ]; then
  echo "Existing .env or docker-compose.yml found; installation stopped." >&2
  exit 1
fi

cat > .env <<'FN_KNOCK_ENV'
FN_KNOCK_IMAGE=hub.fnknock.cn/kcilnk/fn-knock:latest
TZ=Asia/Shanghai
ADMIN_VIEW_PORT=7991
BACKEND_PORT=7998
AUTH_PORT=7997
GO_BACKEND_PORT=7996
GO_REPROXY_PORT=7999
DOCKER_ADMIN_TRUSTED_PROXY_CIDRS=
DOCKER_DISCOVER_LAN_IP=
FN_KNOCK_ENV

cat > docker-compose.yml <<'FN_KNOCK_COMPOSE'
services:
  fn-knock:
    image: ${FN_KNOCK_IMAGE}
    restart: unless-stopped
    network_mode: host
    environment:
      TZ: ${TZ:-Asia/Shanghai}
      FN_KNOCK_RUNTIME_TARGET: docker
      FN_KNOCK_DATA_DIR: /var/lib/fn-knock
      FN_KNOCK_GATEWAY_CONFIG_DIR: /usr/local/etc/fn-knock
      ADMIN_VIEW_PORT: ${ADMIN_VIEW_PORT:-7991}
      BACKEND_PORT: ${BACKEND_PORT:-7998}
      AUTH_PORT: ${AUTH_PORT:-7997}
      GO_BACKEND_PORT: ${GO_BACKEND_PORT:-7996}
      GO_REPROXY_PORT: ${GO_REPROXY_PORT:-7999}
      DOCKER_ADMIN_TRUSTED_PROXY_CIDRS: ${DOCKER_ADMIN_TRUSTED_PROXY_CIDRS:-}
      DOCKER_DISCOVER_LAN_IP: ${DOCKER_DISCOVER_LAN_IP:-}
      ADMIN_VIEW_HOST: 0.0.0.0
      BACKEND_HOST: 127.0.0.1
    volumes:
      - fn_knock_data:/var/lib/fn-knock
      - fn_knock_gateway:/usr/local/etc/fn-knock
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -fsS http://127.0.0.1:${ADMIN_VIEW_PORT:-7991}/api/admin/healthz || exit 1",
        ]
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 20s

volumes:
  fn_knock_data:
  fn_knock_gateway:
FN_KNOCK_COMPOSE

docker compose pull
docker compose up -d
docker compose ps
FN_KNOCK_INSTALL

インストール先は /opt/fn-knock-docker です。.env または docker-compose.yml がすでにある場合、スクリプトは上書きせず停止します。

完全なインストール手順

01 Docker 環境を確認

Linux ホスト、Docker Engine、Docker Compose が必要です。

bash
docker version
docker compose version

以下では HOST ネットワークを使用します。このモードは ports やカスタム bridge を宣言せず、サービスはホストポートで直接待ち受けます。

02 ディレクトリを準備してイメージを取得

bash
mkdir -p /opt/fn-knock-docker
cd /opt/fn-knock-docker
docker pull hub.fnknock.cn/kcilnk/fn-knock:latest

03 .env を作成

次の内容を /opt/fn-knock-docker/.env に保存します。

dotenv
FN_KNOCK_IMAGE=hub.fnknock.cn/kcilnk/fn-knock:latest
TZ=Asia/Shanghai
ADMIN_VIEW_PORT=7991
BACKEND_PORT=7998
AUTH_PORT=7997
GO_BACKEND_PORT=7996
GO_REPROXY_PORT=7999
DOCKER_ADMIN_TRUSTED_PROXY_CIDRS=
DOCKER_DISCOVER_LAN_IP=

主な設定:

設定デフォルト説明
FN_KNOCK_IMAGEhub.fnknock.cn/kcilnk/fn-knock:latestデフォルトでは latest。Docker Hub のイメージまたは固定バージョンタグへ変更可能
ADMIN_VIEW_PORT / GO_REPROXY_PORT7991 / 7999管理パネルと公開ゲートウェイのホスト側ポート
FN_KNOCK_DOCKER_IPV4_SUBNET172.30.0.0/16ブリッジモード専用。競合する場合は別のプライベート CIDR に変更
FN_KNOCK_DOCKER_IPV6_SUBNETfd42:fb33:7f7a:100::/64ブリッジモード専用。Docker bridge の IPv6 ULA /64
DOCKER_ADMIN_TRUSTED_PROXY_CIDRS7991 が信頼済みリバースプロキシの背後にある場合のみ、プロキシの送信元 IP または CIDR を設定
DOCKER_DISCOVER_LAN_IPサードパーティー製リバースプロキシがホストの LAN アドレスを自動検出できない場合のみ設定

04 docker-compose.yml を作成

推奨設定は 1 つの fn-knock コンテナと HOST ネットワークを使用し、ホストの実インターフェイスと IPv6 に直接アクセスします。

yaml
services:
  fn-knock:
    image: ${FN_KNOCK_IMAGE}
    restart: unless-stopped
    network_mode: host
    environment:
      TZ: ${TZ:-Asia/Shanghai}
      FN_KNOCK_RUNTIME_TARGET: docker
      FN_KNOCK_DATA_DIR: /var/lib/fn-knock
      FN_KNOCK_GATEWAY_CONFIG_DIR: /usr/local/etc/fn-knock
      ADMIN_VIEW_PORT: ${ADMIN_VIEW_PORT:-7991}
      BACKEND_PORT: ${BACKEND_PORT:-7998}
      AUTH_PORT: ${AUTH_PORT:-7997}
      GO_BACKEND_PORT: ${GO_BACKEND_PORT:-7996}
      GO_REPROXY_PORT: ${GO_REPROXY_PORT:-7999}
      DOCKER_ADMIN_TRUSTED_PROXY_CIDRS: ${DOCKER_ADMIN_TRUSTED_PROXY_CIDRS:-}
      DOCKER_DISCOVER_LAN_IP: ${DOCKER_DISCOVER_LAN_IP:-}
      ADMIN_VIEW_HOST: 0.0.0.0
      BACKEND_HOST: 127.0.0.1
    volumes:
      - fn_knock_data:/var/lib/fn-knock
      - fn_knock_gateway:/usr/local/etc/fn-knock
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -fsS http://127.0.0.1:${ADMIN_VIEW_PORT:-7991}/api/admin/healthz || exit 1",
        ]
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 20s

volumes:
  fn_knock_data:
  fn_knock_gateway:

任意:ブリッジネットワークへ切り替える

ブリッジでは DDNS がホストのインターフェイスや IPv6 を検出できない場合があります。「インターフェイスから取得」に依存しないことを確認してから、.env を次に置き換えます。

dotenv
FN_KNOCK_IMAGE=hub.fnknock.cn/kcilnk/fn-knock:latest
TZ=Asia/Shanghai
ADMIN_VIEW_PORT=7991
BACKEND_PORT=7998
AUTH_PORT=7997
GO_BACKEND_PORT=7996
GO_REPROXY_PORT=7999
FN_KNOCK_DOCKER_IPV4_SUBNET=172.30.0.0/16
FN_KNOCK_DOCKER_IPV6_SUBNET=fd42:fb33:7f7a:100::/64
DOCKER_ADMIN_TRUSTED_PROXY_CIDRS=
DOCKER_DISCOVER_LAN_IP=

さらに docker-compose.yml を次に置き換えます。

yaml
services:
  fn-knock:
    image: ${FN_KNOCK_IMAGE}
    restart: unless-stopped
    environment:
      TZ: ${TZ:-Asia/Shanghai}
      FN_KNOCK_RUNTIME_TARGET: docker
      FN_KNOCK_DATA_DIR: /var/lib/fn-knock
      FN_KNOCK_GATEWAY_CONFIG_DIR: /usr/local/etc/fn-knock
      ADMIN_VIEW_PORT: ${ADMIN_VIEW_PORT:-7991}
      BACKEND_PORT: ${BACKEND_PORT:-7998}
      AUTH_PORT: ${AUTH_PORT:-7997}
      GO_BACKEND_PORT: ${GO_BACKEND_PORT:-7996}
      GO_REPROXY_PORT: ${GO_REPROXY_PORT:-7999}
      DOCKER_ADMIN_TRUSTED_PROXY_CIDRS: ${DOCKER_ADMIN_TRUSTED_PROXY_CIDRS:-}
      DOCKER_DISCOVER_LAN_IP: ${DOCKER_DISCOVER_LAN_IP:-}
      ADMIN_VIEW_HOST: 0.0.0.0
      BACKEND_HOST: 127.0.0.1
    ports:
      - "${ADMIN_VIEW_PORT:-7991}:${ADMIN_VIEW_PORT:-7991}"
      - "${GO_REPROXY_PORT:-7999}:${GO_REPROXY_PORT:-7999}"
    networks:
      - fn_knock_net
    volumes:
      - fn_knock_data:/var/lib/fn-knock
      - fn_knock_gateway:/usr/local/etc/fn-knock
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -fsS http://127.0.0.1:${ADMIN_VIEW_PORT:-7991}/api/admin/healthz || exit 1",
        ]
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 20s

volumes:
  fn_knock_data:
  fn_knock_gateway:

networks:
  fn_knock_net:
    enable_ipv6: true
    ipam:
      config:
        - subnet: ${FN_KNOCK_DOCKER_IPV4_SUBNET:-172.30.0.0/16}
        - subnet: ${FN_KNOCK_DOCKER_IPV6_SUBNET:-fd42:fb33:7f7a:100::/64}

05 起動して状態を確認

bash
docker compose up -d
docker compose ps
docker compose logs -f fn-knock

最後のコマンドはログを継続表示します。終了するには Ctrl+C を押します。

初回アクセスと設定

既定の HOST モードはホストのネットワーク名前空間を直接使用します。管理パネルは 7991、ゲートウェイは 7999 で待ち受け、その他のサービスは内部またはホスト loopback に留まります。

ポートサービス公開範囲用途
7991管理パネルHOST ネットワーク初回アクセス時に Docker 管理パネルのパスワードを設定
7999ゲートウェイ / プロキシ入口HOST ネットワーク外部クライアントがプロキシ対象サービスへアクセスするときに使用
7998Rust バックエンドホスト loopback / 内部通常は既定値のまま使用
7997認証フロントエンドホスト loopback / 内部通常は既定値のまま使用
7996Go ゲートウェイ管理ホスト loopback / 内部通常は既定値のまま使用
  1. http://<ホストIP>:7991 を開き、Docker 管理パネルのパスワードを設定してログインします。
  2. 管理パネルでリバースプロキシ、サブドメイン、証明書、認証を設定します。
  3. 外部アプリケーションのトラフィックをポート 7999 のゲートウェイへ送ります。
  4. 7991 が信頼済みリバースプロキシの背後にある場合は、.envDOCKER_ADMIN_TRUSTED_PROXY_CIDRS を設定します。
  5. サードパーティー製リバースプロキシがホストの LAN アドレスを自動検出できない場合のみ、DOCKER_DISCOVER_LAN_IP を設定します。

最新イメージへ更新

.envlatest を維持したまま、イメージを再取得してコンテナを再作成します。永続ボリュームは削除されません。

bash
cd /opt/fn-knock-docker
docker compose pull
docker compose up -d
docker compose ps

Watchtower で自動更新

.envlatest を使用している場合は、同じ Docker ホストで Watchtower を実行できます。デフォルトでは、実行中のすべてのコンテナを 24 時間ごとに確認します。イメージタグのダイジェストが変わると、新しいイメージを取得し、既存の設定でコンテナを再作成します。fn-knock のマウント済みボリュームは保持されますが、更新時には短時間の再起動が発生します。固定バージョンタグから別のタグへ自動的に移行することはありません。

bash
docker run -d \
  --name watchtower \
  --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  nickfedor/watchtower --cleanup

--cleanup は、コンテナの更新が正常に完了した後、置き換えられた古いイメージを削除します。このオプションを付けない場合、Watchtower はデフォルトで古いイメージを削除しないため、リポジトリ名とタグが <none> のダングリングイメージが残ることがあります。このオプションは fn-knock の名前付きデータボリュームを削除しません。

Watchtower が起動していることを確認し、チェック履歴を表示します。

bash
docker ps --filter name=watchtower
docker logs watchtower

この基本設定はホスト上で実行中のすべてのコンテナを管理し、Docker Socket を通じて Docker を管理できる強い権限を取得します。信頼できるホストでのみ使用し、有効にする前に fn-knock をバックアップしてください。自動更新してはいけないコンテナがある場合は、Watchtower 公式ドキュメントに従って、コンテナ名、ラベル、または Scope で更新対象を制限してください。

管理パネルのパスワードをリセット

パスワードを忘れた場合は Docker ホストへログインし、次を実行します。

bash
cd /opt/fn-knock-docker && docker compose exec -T fn-knock fn-knock-reset-panel-password

次にポート 7991 へアクセスすると、初回パスワード設定に戻ります。このコマンドが消去するのは、管理パネルのパスワード、ログインセッション、ログイン失敗時のバックオフ状態だけです。アプリケーション設定、プロキシルール、証明書、許可リスト、ログ、データボリュームは削除されません。

関連ドキュメント

QQ コミュニティ:1081609274