dev
dec8790a3a
fix: AI photo enhance modal stays open with result preview; fix basicsr build
...
- Modal no longer auto-closes after Real-ESRGAN completes; result loads into
canvas so user can review, adjust sliders, and choose to apply or discard
- Backend skips swapEntryPhotoFiles until user confirms via Применить
- New DELETE /api/entries/:id/photo/enhance-ai/preview for temp file cleanup
- photo-ai Dockerfile: patch basicsr via find+sed instead of import (avoids
torchvision.functional_tensor import crash)
2026-09-17 16:44:44 +03:00
dev
3a345cbefd
feat: AI photo enhancement (Real-ESRGAN container) + restore original
...
- new photo-ai service: FastAPI + Real-ESRGAN x2plus on CPU, internal only
- async job queue in server (POST enhance-ai / GET status), 5min timeout, sequential processing
- keep original photo backup (entries.photo_original_path, uploads/.originals), restore-original endpoint
- UI: AI button and restore-original button in enhance modal
- db: photo_original_path column (init.sql, migration.sql, runtime ensure)
2026-09-17 15:37:49 +03:00
dev
c4fd31cd53
feat: hybrid photo enhance engine (server sharp + client canvas), denoise
...
- enhance endpoint accepts JSON params, processes original on disk via sharp pipeline (median, modulate, linear, sharpen, mozjpeg)
- client fallback renders full-size canvas, keeps multipart path
- engine selection setting: auto/server/client, auto falls back to client on error/timeout
- denoise slider (median filter), noise-aware auto mode, preview capped at 1600px
2026-09-17 15:16:42 +03:00
dev
049df61e55
feat: photo quality improvements
...
- webcam capture resolution/quality configurable in admin settings (defaults 640x480 / 0.92)
- enhance photo modal in journal: original vs preview with sliders (brightness, contrast, saturation, sharpen) and auto-levels button
- new endpoint PUT /api/entries/:id/photo/enhance replaces photo, cleans old file and thumb
- sharper HEIC conversion (0.92) and webp thumbnails (85)
- worker: fail explicitly on empty AI response
2026-09-17 15:07:43 +03:00
dev
57e48a9d4f
fix(ai): adaptive max_tokens per backend (reasoning profiles get 1024+, native llama.cpp stays compact; per-profile max_tokens override); include entry texts in ai_status SSE notify so journal updates live without reload; audit log action filter; links pagination; settings validation & UI improvements
2026-09-17 14:12:36 +03:00
dev
a93e37a6b1
fix(settings): prevent aiActiveProfile select from overflowing card-foot (shrinkable label+select, min-width:0 on grid cards)
2026-09-17 12:11:18 +03:00
dev
0b4243fe91
feat(docker): add host.docker.internal:host-gateway to app so it can reach host Ollama (AI profiles)
2026-09-17 12:06:11 +03:00
dev
66f7fdc1a8
refactor(settings): AI profile add/edit moved into a modal dialog (overlay click + Esc to close)
2026-09-17 12:00:19 +03:00
dev
d7c793c67a
fix(settings): constrain aiActiveProfile select width so it stays inside card-foot
2026-09-17 11:58:34 +03:00
dev
efe2a42d1d
feat(settings): AI model profiles management — native llama.cpp + custom OpenAI-compatible providers, default model selection, connection test
2026-09-17 11:54:08 +03:00
dev
bbfde902a5
feat(journal): live AI status updates in entry cards via Postgres NOTIFY trigger + SSE ai_status events
2026-09-17 11:14:27 +03:00
dev
cc9a9e6c2d
feat(journal): beautiful entrance animation for entries — cascade fade-up on load, yellow glow pop for newly submitted entries
2026-09-16 20:14:09 +03:00
dev
2784084c68
feat(journal): live updates on new entry via SSE (/api/events) — admin journal auto-refreshes when a student submits
2026-09-16 20:09:06 +03:00
dev
e8337c2845
feat(share): group entries by date on public /s/<token> page
2026-09-16 15:06:30 +03:00
dev
6cfb13310d
chore: checkpoint before date grouping on share page
2026-09-16 15:05:56 +03:00
dev
2c8beedc4b
feat: анти-спам блокировка повторной отправки на главной (cooldown по spam_interval_min)
...
- index.html/index.js: экран подтверждения отправки с обратным отсчётом
- локальный запрет повторной отправки через localStorage (по настройке spam_interval_min)
- server.js: отдаём spam_interval_min в public-settings (default 30)
- Dockerfile: timeout для apk add, чтобы сборка не зависала на недоступном зеркале
- docker-compose.yml: отключаем cloudflared сервис (закомментирован)
2026-09-13 12:27:35 +03:00
dev
0b763e5738
feat(cloudflared): timeout+fallback for WG handshake (WG_HANDSHAKE_TIMEOUT) so tunnel still starts when VPN peer is down
2026-09-13 00:34:43 +03:00
dev
1fc17225b0
fix(cloudflared): chmod 600 wg config in /tmp before wg-quick so WG starts regardless of host perms
2026-09-13 00:29:41 +03:00
dev
a7692b1c35
chore: exclude wg/ from docker build context so WG config stays host-only
2026-09-13 00:20:51 +03:00
dev
fac668567e
feat: редизайн страницы отчёта ученика — портфолио-стиль, галерея с листанием и видео
...
- renderStudentReport: детский учебный дизайн (крупные скругления, sticky-навигация, секции-карточки)
- журнал занятий в две колонки (одна на мобильных)
- единая галерея фото и видео: листание кнопками/стрелками, счётчик
- воспроизведение видео прямо в лайтбоксе
- кнопка закрытия ✕, закрытие по фону и Esc
- модалка экспорта отчёта ученика (период и выбор содержимого)
2026-09-12 23:55:35 +03:00
dev
3c40e94a57
fix: get cloudflared WireGuard tunnel actually serving
...
- Dockerfile.cloudflared: add iptables + ip6tables (wg-quick needs them for ::/0 full tunnel)
- docker-compose: privileged:true for cloudflared so wg-quick can set net.ipv4.conf.all.src_valid_mark
- start-cloudflared.sh: restore resolv.conf after wg-quick (resolvconf wiped docker DNS 127.0.0.11 => app unresolvable => Host Error)
2026-09-12 18:51:19 +03:00
dev
dd4d306a4e
feat: cloudflared container with optional WireGuard egress
...
- Dockerfile.cloudflared builds cloudflared (official static binary) on Alpine with wireguard-tools
2026-09-12 17:40:42 +03:00
dev
9203eee5d2
fix: требовать фотографию при создании записи (POST /api/entries) на уровне API
2026-09-12 17:26:51 +03:00
dev
b263a735ac
fix: обязательная фотография в форме отправки; модалка редактирования шире и в две колонки; поддержка .jfif в прикреплении
2026-09-12 17:19:53 +03:00
dev
854f2d4650
feat: публикация наружу через Cloudflare Quick Tunnel (cloudflared)
2026-09-12 15:06:56 +03:00
dev
779270fb73
UI: пагинация, вынос пагинатора, быстрые действия
2026-09-12 14:18:15 +03:00
dev
1d706f1356
Dashboard: add Блокировки link to navigation
2026-09-12 12:52:23 +03:00
dev
a8e1aa743d
Build app image on host network to bypass bridge egress/TLS issues
2026-09-12 12:22:59 +03:00
dev
1e38419f07
Dockerfile: cascade apk mirror fallback to HTTP (signature-verified) with diagnostics on total failure
2026-09-12 12:09:15 +03:00
dev
21b00a8e09
Dockerfile: fall back to edge.kernel.org mirror when dl-cdn TLS fetch fails
2026-09-12 11:30:13 +03:00
dev
db684efe9e
Dockerfile: retry apk add on transient Alpine mirror TLS failures
2026-09-12 11:04:40 +03:00
dev
fd753c1318
Add cookie notice with settings, jfif preview support, and share page title from link name
2026-09-12 10:05:02 +03:00
dev
192de5e690
Sidebar: color inactive nav icons by section meaning via data-nav attribute
2026-09-12 01:18:57 +03:00
dev
809b978c4b
Bans: confirm unban via alert; audit labels for ip.ban/ip.unban; worker page lucide icons
2026-09-12 01:14:58 +03:00
dev
c54a5b180c
Settings bans card: unban also requires confirmation
2026-09-12 01:06:24 +03:00
dev
e69426882a
Bans: unban requires inline confirmation row with yes/cancel
2026-09-12 01:01:59 +03:00
dev
5aee2ce3f5
Bans page: users-style table with badges, client-side pagination, manual ban modal (POST /api/bans with ip/reason/hours), unban row buttons
2026-09-12 00:59:32 +03:00
dev
7dd816cfce
Add dedicated Bans page (bans.html) with active IP bans table, unban and refresh; nav item for admins; settings card kept
2026-09-12 00:53:35 +03:00
dev
19b0c855a9
Cache HTML/JS/CSS with no-cache revalidation (ETag 304): browsers always get fresh pages after docker restart; vendor and image caches unchanged
2026-09-12 00:47:18 +03:00
dev
d5359dd31f
Add honeypot field to login form: instant 24h IP ban on autofill
2026-09-12 00:40:29 +03:00
dev
2c7ec17c8b
Add IP autoban system: banned_ips table, global ipGuard middleware, 24h bans on honeypot fill / 10 failed logins / 10 wrong share passwords; trust proxy for real client IPs behind funnel; admin API and settings UI to manage active bans
2026-09-12 00:35:51 +03:00
dev
2bebfc071c
Replace emoji icons with lucide icons on settings page
2026-09-12 00:04:55 +03:00
dev
fd9b470c4c
Add server-side image thumbnails (sharp): /uploads/thumb/<name> route, ?thumb=1 on file endpoints, disk-cached 480px WebP previews; grids now load thumbnails with lazy loading
2026-09-12 00:02:23 +03:00
dev
9798872f20
Add in-memory caching layer with TTL and invalidation for settings, groups, students, entries, share payloads and stats; add static asset caching headers
2026-09-11 23:52:58 +03:00
dev
f9d310c8ea
Add .dockerignore to reduce build context from 542MB to 5kB
2026-09-11 23:29:58 +03:00
dev
f8036fae79
Fix: backup/restore now includes group_photos and entry_photos tables; increase AI request timeout to 120s (configurable via AI_REQUEST_TIMEOUT_MS)
2026-09-11 23:12:16 +03:00
dev
4db02d75bc
Add AI-check details modal on worker page and raise backup upload limit
2026-09-11 16:26:30 +03:00
dev
ee19da7fa0
Add audit details modal and translate remaining action labels
...
- Make Детали cell clickable to open a modal with the full details text\n- Translate missing audit action keys (auth.login, user.*, branch.*, group.photo.*, entry.photo.*)
2026-09-11 14:45:07 +03:00
dev
7044505915
Fix AI status badge sizing on worker page
...
Restore .ai-badge as a text pill and scope the compact icon circle to .ai-badge-ic (used by journal); worker page text badges now render at correct size
2026-09-11 14:38:46 +03:00
dev
ad81adfe71
Migrate UI to Lucide icons, reorder sidebar, and polish journal/groups UX
...
- Replace emoji icons with Lucide across admin pages; add vendor/lucide.min.js and renderIcons() helper\n- Reorder sidebar logically (Dashboard, Journal, Students, Groups, Files, Links, Trash + admin sections)\n- Groups: open photo chronology only via the Фото button; covers no longer clickable\n- Journal: show group badge over card photo, compact AI-status icon beside description, and date range in empty-state message\n- Update README (AI worker, Lucide, worker.js)
2026-09-11 14:33:41 +03:00