2c70f2859a
Replace hardcoded Cloudflare DNS-01 with a data-driven provider registry supporting 11 providers (Cloudflare, Route 53, DigitalOcean, Duck DNS, Hetzner, Vultr, Porkbun, GoDaddy, Namecheap, OVH, Linode). Users can configure multiple providers with encrypted credentials and select a default. Per-certificate provider override is supported via providerOptions. - Add src/lib/dns-providers.ts with provider definitions, credential encrypt/decrypt, and Caddy config builder - Change DnsProviderSettings to multi-provider format with default selection - Auto-migrate legacy Cloudflare settings on startup (db.ts) - Normalize old single-provider format on read (getDnsProviderSettings) - Refactor buildTlsAutomation() to use provider registry - Add GET /api/v1/dns-providers endpoint for provider discovery - Add dns-provider settings group to REST API and instance sync - Replace Cloudflare settings card with multi-provider UI (add/remove providers, set default, dynamic credential forms) - Add 10 DNS provider modules to Caddy Dockerfile - Update OpenAPI spec, E2E tests, and unit test mocks Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
86 lines
3.3 KiB
TypeScript
86 lines
3.3 KiB
TypeScript
import SettingsClient from "./SettingsClient";
|
|
import { getGeneralSettings, getAuthentikSettings, getMetricsSettings, getLoggingSettings, getDnsSettings, getDnsProviderSettings, getSetting, getUpstreamDnsResolutionSettings, getGeoBlockSettings } from "@/src/lib/settings";
|
|
import { getInstanceMode, getSlaveLastSync, getSlaveMasterToken, isInstanceModeFromEnv, isSyncTokenFromEnv, getEnvSlaveInstances } from "@/src/lib/instance-sync";
|
|
import { listInstances } from "@/src/lib/models/instances";
|
|
import { listOAuthProviders } from "@/src/lib/models/oauth-providers";
|
|
import { DNS_PROVIDERS } from "@/src/lib/dns-providers";
|
|
import { config } from "@/src/lib/config";
|
|
import { requireAdmin } from "@/src/lib/auth";
|
|
|
|
export default async function SettingsPage() {
|
|
await requireAdmin();
|
|
|
|
// Check if configuration is from environment variables
|
|
const modeFromEnv = isInstanceModeFromEnv();
|
|
const tokenFromEnv = isSyncTokenFromEnv();
|
|
|
|
const [general, dnsProvider, authentik, metrics, logging, dns, upstreamDnsResolution, instanceMode, globalGeoBlock, oauthProviders] = await Promise.all([
|
|
getGeneralSettings(),
|
|
getDnsProviderSettings(),
|
|
getAuthentikSettings(),
|
|
getMetricsSettings(),
|
|
getLoggingSettings(),
|
|
getDnsSettings(),
|
|
getUpstreamDnsResolutionSettings(),
|
|
getInstanceMode(),
|
|
getGeoBlockSettings(),
|
|
listOAuthProviders(),
|
|
]);
|
|
|
|
const [overrideGeneral, overrideDnsProvider, overrideAuthentik, overrideMetrics, overrideLogging, overrideDns, overrideUpstreamDnsResolution] =
|
|
instanceMode === "slave"
|
|
? await Promise.all([
|
|
getSetting("general"),
|
|
getSetting("dns_provider"),
|
|
getSetting("authentik"),
|
|
getSetting("metrics"),
|
|
getSetting("logging"),
|
|
getSetting("dns"),
|
|
getSetting("upstream_dns_resolution")
|
|
])
|
|
: [null, null, null, null, null, null, null];
|
|
|
|
const [slaveToken, slaveLastSync] = instanceMode === "slave"
|
|
? await Promise.all([getSlaveMasterToken(), getSlaveLastSync()])
|
|
: [null, null];
|
|
|
|
const instances = instanceMode === "master" ? await listInstances() : [];
|
|
const envInstances = instanceMode === "master" ? getEnvSlaveInstances() : [];
|
|
|
|
return (
|
|
<SettingsClient
|
|
general={general}
|
|
dnsProvider={dnsProvider}
|
|
dnsProviderDefinitions={DNS_PROVIDERS}
|
|
authentik={authentik}
|
|
metrics={metrics}
|
|
logging={logging}
|
|
dns={dns}
|
|
upstreamDnsResolution={upstreamDnsResolution}
|
|
globalGeoBlock={globalGeoBlock}
|
|
oauthProviders={oauthProviders}
|
|
baseUrl={config.baseUrl}
|
|
instanceSync={{
|
|
mode: instanceMode,
|
|
modeFromEnv,
|
|
tokenFromEnv,
|
|
overrides: {
|
|
general: overrideGeneral !== null,
|
|
dnsProvider: overrideDnsProvider !== null,
|
|
authentik: overrideAuthentik !== null,
|
|
metrics: overrideMetrics !== null,
|
|
logging: overrideLogging !== null,
|
|
dns: overrideDns !== null,
|
|
upstreamDnsResolution: overrideUpstreamDnsResolution !== null
|
|
},
|
|
slave: instanceMode === "slave" ? {
|
|
hasToken: Boolean(slaveToken),
|
|
lastSyncAt: slaveLastSync?.at ?? null,
|
|
lastSyncError: slaveLastSync?.error ?? null
|
|
} : null,
|
|
master: instanceMode === "master" ? { instances, envInstances } : null
|
|
}}
|
|
/>
|
|
);
|
|
}
|