This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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<string | null>(null)
|
||||
const [responses, setResponses] = useState<Response[]>([])
|
||||
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 && <p className="admin-gate-error">Неверный пароль</p>}
|
||||
{error && <p className="admin-gate-error">{error}</p>}
|
||||
<button className="admin-gate-btn" type="submit" disabled={loading}>
|
||||
{loading ? 'Загрузка...' : 'Войти'}
|
||||
</button>
|
||||
|
||||
Reference in New Issue
Block a user