Docker Compose でデプロイ
現在のネットワークに適したイメージソースを選び、完全な Compose 設定を使用して、Linux ホストまたは Linux ベースの NAS で fn-knock を実行します。
イメージソース
| イメージソース | イメージ | 推奨ネットワーク |
|---|---|---|
| 公式ミラー | hub.fnknock.cn/kcilnk/fn-knock:latest | 中国本土のネットワーク。latest は 30 分ごとに同期 |
| Docker Hub | kcilnk/fn-knock:latest | Docker Hub に安定して接続できるネットワーク |
以下では公式ミラーを使用します。ソースを切り替える場合は、pull コマンドと .env の FN_KNOCK_IMAGE を対応するアドレスに変更してください。バージョンを固定する場合は、latest を公開済みの固定タグに変更します。
ネットワークモード
| ネットワークモード | 推奨 | 説明 |
|---|---|---|
| HOST ネットワーク | 推奨・既定 | ホストネットワークを直接使用し、実際のインターフェイスと IPv6 を認識できます |
| ブリッジネットワーク | 任意 | 分離されたデュアルスタック bridge とポートマッピングを使用しますが、DDNS がホストのインターフェイスや IPv6 を検出できない場合があります |
DDNS の「インターフェイスから取得」を使用する場合や、ホスト IPv6 に依存する場合は HOST ネットワークを使用してください。ブリッジは、ホストインターフェイスの検出よりもネットワーク分離を優先する場合に選択します。
一括インストール
対象 Linux ホストの root ターミナルへ以下のスクリプト全体を貼り付けます。既定では推奨の HOST ネットワークを使用し、完全な Compose 設定を書き込んで fn-knock を起動します。
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 が必要です。
docker version
docker compose version以下では HOST ネットワークを使用します。このモードは ports やカスタム bridge を宣言せず、サービスはホストポートで直接待ち受けます。
02 ディレクトリを準備してイメージを取得
mkdir -p /opt/fn-knock-docker
cd /opt/fn-knock-docker
docker pull hub.fnknock.cn/kcilnk/fn-knock:latest03 .env を作成
次の内容を /opt/fn-knock-docker/.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_IMAGE | hub.fnknock.cn/kcilnk/fn-knock:latest | デフォルトでは latest。Docker Hub のイメージまたは固定バージョンタグへ変更可能 |
ADMIN_VIEW_PORT / GO_REPROXY_PORT | 7991 / 7999 | 管理パネルと公開ゲートウェイのホスト側ポート |
FN_KNOCK_DOCKER_IPV4_SUBNET | 172.30.0.0/16 | ブリッジモード専用。競合する場合は別のプライベート CIDR に変更 |
FN_KNOCK_DOCKER_IPV6_SUBNET | fd42:fb33:7f7a:100::/64 | ブリッジモード専用。Docker bridge の IPv6 ULA /64 |
DOCKER_ADMIN_TRUSTED_PROXY_CIDRS | 空 | 7991 が信頼済みリバースプロキシの背後にある場合のみ、プロキシの送信元 IP または CIDR を設定 |
DOCKER_DISCOVER_LAN_IP | 空 | サードパーティー製リバースプロキシがホストの LAN アドレスを自動検出できない場合のみ設定 |
04 docker-compose.yml を作成
推奨設定は 1 つの fn-knock コンテナと HOST ネットワークを使用し、ホストの実インターフェイスと IPv6 に直接アクセスします。
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 を次に置き換えます。
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 を次に置き換えます。
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 起動して状態を確認
docker compose up -d
docker compose ps
docker compose logs -f fn-knock最後のコマンドはログを継続表示します。終了するには Ctrl+C を押します。
初回アクセスと設定
既定の HOST モードはホストのネットワーク名前空間を直接使用します。管理パネルは 7991、ゲートウェイは 7999 で待ち受け、その他のサービスは内部またはホスト loopback に留まります。
| ポート | サービス | 公開範囲 | 用途 |
|---|---|---|---|
7991 | 管理パネル | HOST ネットワーク | 初回アクセス時に Docker 管理パネルのパスワードを設定 |
7999 | ゲートウェイ / プロキシ入口 | HOST ネットワーク | 外部クライアントがプロキシ対象サービスへアクセスするときに使用 |
7998 | Rust バックエンド | ホスト loopback / 内部 | 通常は既定値のまま使用 |
7997 | 認証フロントエンド | ホスト loopback / 内部 | 通常は既定値のまま使用 |
7996 | Go ゲートウェイ管理 | ホスト loopback / 内部 | 通常は既定値のまま使用 |
http://<ホストIP>:7991を開き、Docker 管理パネルのパスワードを設定してログインします。- 管理パネルでリバースプロキシ、サブドメイン、証明書、認証を設定します。
- 外部アプリケーションのトラフィックをポート
7999のゲートウェイへ送ります。 7991が信頼済みリバースプロキシの背後にある場合は、.envでDOCKER_ADMIN_TRUSTED_PROXY_CIDRSを設定します。- サードパーティー製リバースプロキシがホストの LAN アドレスを自動検出できない場合のみ、
DOCKER_DISCOVER_LAN_IPを設定します。
最新イメージへ更新
.env の latest を維持したまま、イメージを再取得してコンテナを再作成します。永続ボリュームは削除されません。
cd /opt/fn-knock-docker
docker compose pull
docker compose up -d
docker compose psWatchtower で自動更新
.env で latest を使用している場合は、同じ Docker ホストで Watchtower を実行できます。デフォルトでは、実行中のすべてのコンテナを 24 時間ごとに確認します。イメージタグのダイジェストが変わると、新しいイメージを取得し、既存の設定でコンテナを再作成します。fn-knock のマウント済みボリュームは保持されますが、更新時には短時間の再起動が発生します。固定バージョンタグから別のタグへ自動的に移行することはありません。
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 が起動していることを確認し、チェック履歴を表示します。
docker ps --filter name=watchtower
docker logs watchtowerこの基本設定はホスト上で実行中のすべてのコンテナを管理し、Docker Socket を通じて Docker を管理できる強い権限を取得します。信頼できるホストでのみ使用し、有効にする前に fn-knock をバックアップしてください。自動更新してはいけないコンテナがある場合は、Watchtower 公式ドキュメントに従って、コンテナ名、ラベル、または Scope で更新対象を制限してください。
管理パネルのパスワードをリセット
パスワードを忘れた場合は Docker ホストへログインし、次を実行します。
cd /opt/fn-knock-docker && docker compose exec -T fn-knock fn-knock-reset-panel-password次にポート 7991 へアクセスすると、初回パスワード設定に戻ります。このコマンドが消去するのは、管理パネルのパスワード、ログインセッション、ログイン失敗時のバックオフ状態だけです。アプリケーション設定、プロキシルール、証明書、許可リスト、ログ、データボリュームは削除されません。
