diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 0b9c0cb..233e53a 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -34,17 +34,24 @@ services: frontend: image: 192.168.31.100:3847/arrelin/wedding-frontend:latest container_name: wedding_frontend - expose: - - "80" depends_on: - backend networks: - app_network + - coolify restart: unless-stopped + labels: + - traefik.enable=true + - traefik.http.routers.wedding-frontend.rule=Host(`weddinge.duckdns.org`) + - traefik.http.routers.wedding-frontend.entrypoints=https + - traefik.http.routers.wedding-frontend.tls=true + - traefik.http.services.wedding-frontend.loadbalancer.server.port=80 networks: app_network: driver: bridge + coolify: + external: true volumes: postgres_data: diff --git a/frontend/src/components/Admin.tsx b/frontend/src/components/Admin.tsx index 2531733..b4eec93 100644 --- a/frontend/src/components/Admin.tsx +++ b/frontend/src/components/Admin.tsx @@ -16,24 +16,24 @@ interface Response { export default function Admin() { const [password, setPassword] = useState('') const [authed, setAuthed] = useState(false) - const [error, setError] = useState(false) + const [error, setError] = useState(null) const [responses, setResponses] = useState([]) const [loading, setLoading] = useState(false) const handleLogin = async (e: React.FormEvent) => { e.preventDefault() setLoading(true) - setError(false) + setError(null) try { const res = await fetch('/api/admin/responses', { headers: { 'x-admin-password': password }, }) - if (res.status === 401) { setError(true); return } - if (!res.ok) throw new Error() + if (res.status === 401) { setError('Неверный пароль'); return } + if (!res.ok) throw new Error(`Ошибка сервера: ${res.status}`) setResponses(await res.json()) setAuthed(true) - } catch { - setError(true) + } catch (err) { + setError(err instanceof Error ? err.message : 'Не удалось подключиться к серверу') } finally { setLoading(false) } @@ -52,7 +52,7 @@ export default function Admin() { onChange={e => setPassword(e.target.value)} autoFocus /> - {error &&

Неверный пароль

} + {error &&

{error}

}