import { useEffect, useState } from 'react' import { apiRequest } from '../api/client' import { Shield, Loader2 } from 'lucide-react' interface Domain { id: number name: string port: string site_id: number site_name: string site_path: string } interface Certificate { name: string path: string } export function DomainsPage() { const [domains, setDomains] = useState([]) const [certificates, setCertificates] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [requesting, setRequesting] = useState(null) const [requestDomain, setRequestDomain] = useState(null) const [requestEmail, setRequestEmail] = useState('') const load = () => { setLoading(true) Promise.all([ apiRequest('/ssl/domains'), apiRequest<{ certificates: Certificate[] }>('/ssl/certificates'), ]) .then(([d, c]) => { setDomains(d) setCertificates(c.certificates || []) }) .catch((err) => setError(err.message)) .finally(() => setLoading(false)) } useEffect(() => { load() }, []) const handleRequestCert = (e: React.FormEvent) => { e.preventDefault() if (!requestDomain) return setRequesting(requestDomain.name) apiRequest<{ status: boolean }>('/ssl/request', { method: 'POST', body: JSON.stringify({ domain: requestDomain.name, webroot: requestDomain.site_path, email: requestEmail, }), }) .then(() => { setRequestDomain(null) load() }) .catch((err) => setError(err.message)) .finally(() => setRequesting(null)) } const hasCert = (domain: string) => certificates.some((c) => c.name === domain || c.name.startsWith(domain + ' ')) if (loading) return
Loading...
if (error) return
{error}
return (

Domains & SSL

Request Let's Encrypt certificates for your site domains. Requires certbot and nginx configured for the domain.

Domains (from sites)

{domains.length === 0 ? (
No domains. Add a site first.
) : ( domains.map((d) => (
{d.name} {d.port !== '80' && ( :{d.port} )} ({d.site_name})
{hasCert(d.name) ? ( Cert ) : ( )}
)) )}

Certificates

{certificates.length === 0 ? (
No certificates yet
) : ( certificates.map((c) => (
{c.name}
)) )}
{requestDomain && (

Request SSL for {requestDomain.name}

setRequestEmail(e.target.value)} placeholder="admin@example.com" className="w-full px-4 py-2 border rounded-lg bg-white dark:bg-gray-700" required />
)}
) }