reverse-proxy-generator.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. 'use client';
  2. import { useState } from 'react';
  3. import {
  4. buildProxyConfig,
  5. buildCertCommand,
  6. type ProxyServer,
  7. type CertTool,
  8. type ReverseProxyOptions,
  9. } from '@/lib/xray/reverse-proxy';
  10. import { ToolFrame } from './tool-frame';
  11. import { TextField, SelectField } from './shared/fields';
  12. import { OutputBlock } from './shared/output-block';
  13. export function ReverseProxyGenerator() {
  14. const [server, setServer] = useState<ProxyServer>('nginx');
  15. const [domain, setDomain] = useState('panel.example.com');
  16. const [panelPort, setPanelPort] = useState('2053');
  17. const [panelPath, setPanelPath] = useState('/panel');
  18. const [certTool, setCertTool] = useState<CertTool>('certbot');
  19. const options: ReverseProxyOptions = { server, domain, panelPort, panelPath, certTool };
  20. return (
  21. <ToolFrame
  22. title="Reverse-proxy config generator"
  23. description="Generate an Nginx or Caddy reverse-proxy config (with WebSocket support) and a matching certificate command."
  24. >
  25. <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
  26. <SelectField
  27. label="Server"
  28. value={server}
  29. onChange={(v) => setServer(v as ProxyServer)}
  30. options={['nginx', 'caddy']}
  31. />
  32. <TextField label="Domain" value={domain} onChange={setDomain} />
  33. <TextField
  34. label="Panel port"
  35. value={panelPort}
  36. onChange={setPanelPort}
  37. inputMode="numeric"
  38. />
  39. <TextField label="Panel web base path" value={panelPath} onChange={setPanelPath} />
  40. {server === 'nginx' ? (
  41. <SelectField
  42. label="Certificate tool"
  43. value={certTool}
  44. onChange={(v) => setCertTool(v as CertTool)}
  45. options={['certbot', 'acme.sh']}
  46. />
  47. ) : null}
  48. </div>
  49. <div className="mt-4 grid grid-cols-1 gap-4">
  50. <OutputBlock
  51. label={server === 'nginx' ? 'nginx server block' : 'Caddyfile'}
  52. value={buildProxyConfig(options)}
  53. />
  54. {server === 'nginx' ? (
  55. <OutputBlock label="Obtain a certificate" value={buildCertCommand(options)} />
  56. ) : (
  57. <p className="text-sm text-fd-muted-foreground">
  58. Caddy obtains and renews TLS certificates automatically — no extra command needed.
  59. </p>
  60. )}
  61. </div>
  62. </ToolFrame>
  63. );
  64. }