'use client'; import { AppModal } from '@/components/ui/app-modal'; import type { TunnelItem } from '@/features/tunnels/types'; import { CodeBlock, PrimaryButton, } from '@/features/shared/components/resource-primitives'; import { useState, useEffect } from 'react'; import { getServerUrl } from '@/features/nodes/utils'; export function TunnelDeploymentModal({ isOpen, tunnel, onClose, }: { isOpen: boolean; tunnel?: TunnelItem | null; onClose: () => void; }) { const [serverUrl, setServerUrl] = useState(''); useEffect(() => { if (typeof window !== 'undefined' && !serverUrl) { setServerUrl(window.location.origin); } }, [serverUrl]); if (!tunnel) { return null; } const normalizedServerUrl = getServerUrl(serverUrl); const image = 'ghcr.io/rain-kl/openflare-flared:latest'; const dockerRunCmd = [ `docker pull ${image}`, `docker rm -f openflare-flared 2>/dev/null || true`, `docker run -d --name openflare-flared --net host --restart unless-stopped \\`, ` -v /var/run/docker.sock:/var/run/docker.sock \\`, ` -v openflare_flared_data:/app/data \\`, ` -e OPENFLARE_SERVER_URL=${normalizedServerUrl} \\`, ` -e OPENFLARE_TUNNEL_TOKEN=${tunnel.tunnel_token} \\`, ` ${image}`, ].join('\n'); const dockerComposeYaml = `version: '3.8' services: openflare-flared: image: ${image} container_name: openflare-flared network_mode: "host" restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock - openflare_flared_data:/app/data environment: - OPENFLARE_SERVER_URL=${normalizedServerUrl} - OPENFLARE_TUNNEL_TOKEN=${tunnel.tunnel_token} volumes: openflare_flared_data: `; return ( 关闭 } >

方式一:Docker Run

{dockerRunCmd}

方式二:Docker Compose (docker-compose.yml)

{dockerComposeYaml}

隧道 Token (仅供高级用法)

{tunnel.tunnel_token}

); }