import { useEffect, useState } from 'react' import { Server, RefreshCw, RotateCcw, CheckCircle, XCircle } from 'lucide-react' import { api } from '../api/client' interface WebStatus { apache: { active: boolean } php82fpm: { active: boolean } php83fpm: { active: boolean } } export default function WebServer() { const [status, setStatus] = useState(null) const [logs, setLogs] = useState<{ lines: string[] } | null>(null) const [logType, setLogType] = useState<'access' | 'error'>('access') const [loading, setLoading] = useState(false) const [testResult, setTestResult] = useState(null) const [reloading, setReloading] = useState(false) const fetchData = async () => { setLoading(true) try { const [s, l] = await Promise.all([ api.get('/nixserver/webserver/status'), api.get(`/nixserver/webserver/logs/${logType}`), ]) setStatus(s.data.data) setLogs(l.data.data) } finally { setLoading(false) } } useEffect(() => { fetchData() }, [logType]) const testConfig = async () => { try { const r = await api.post('/nixserver/webserver/apache/test') setTestResult(r.data.data.output) } catch (err: unknown) { setTestResult((err as { response?: { data?: { error?: string } } })?.response?.data?.error ?? 'Test failed') } } const reload = async (service: 'apache' | 'fpm82' | 'fpm83') => { setReloading(true) try { if (service === 'apache') { await api.post('/nixserver/webserver/apache/reload') } else { await api.post('/nixserver/webserver/fpm/reload', { version: service === 'fpm82' ? '8.2' : '8.3' }) } fetchData() } catch (err: unknown) { alert((err as { response?: { data?: { error?: string } } })?.response?.data?.error ?? 'Reload failed') } finally { setReloading(false) } } const services: { key: keyof WebStatus; label: string; reload?: 'apache' | 'fpm82' | 'fpm83' }[] = [ { key: 'apache', label: 'apache2', reload: 'apache' }, { key: 'php82fpm', label: 'php8.2-fpm', reload: 'fpm82' }, { key: 'php83fpm', label: 'php8.3-fpm', reload: 'fpm83' }, ] return (

Web Server

Apache and PHP-FPM management

{status && (
{services.map(({ key, label, reload: reloadKey }) => (
{label}
{status[key].active ? : } {reloadKey && ( )}
))}
)}
{testResult && (
{testResult}
)}

Apache Logs

{(['access', 'error'] as const).map(t => ( ))}
            {logs?.lines.slice(-100).join('\n') ?? 'Loading...'}
          
) }