Логирование в stdout (видно в Portainer) + асинхронные задания edit/upscale с опросом статуса (фикс 504/499 при длинных запросах)

This commit is contained in:
2026-08-26 14:10:45 +07:00
parent d9eccfb4b7
commit 27a2ac304c
4 changed files with 476 additions and 139 deletions

View File

@@ -22,6 +22,12 @@ Codex CLI) и увеличивает разрешение через домаш
`RealESRGAN_x4plus.safetensors` — применяется к выбранной (в том числе
отредактированной) версии.
Редактирование и апскейл выполняются в фоне: `POST /api/edit` и
`POST /api/upscale` отвечают мгновенно с идентификатором задания (`jobId`),
а тяжёлая работа продолжается на сервере. Фронтенд опрашивает
`GET /api/jobs/:id/status` каждые 3 секунды; страницу можно закрыть —
готовая версия появится в истории.
## Требования
- Node.js 20 или новее
@@ -73,6 +79,45 @@ npm start
`GET /api/me`, `POST /api/logout`. Вход в систему — `POST /api/login`
с JSON-телом `{"username": "...", "password": "..."}`.
## Логирование
Все действия сервера пишутся в стандартный вывод контейнера — смотрите их в
**Portainer → Containers → kadr-photo-editor → Logs**.
Что логируется:
- каждый запрос к `/api/*` (метод, путь, HTTP-статус, время обработки);
- старт сервера (порт, логин, адрес ComfyUI);
- вход и выход пользователя;
- импорт фотографии;
- редактирование: запуск задания, успешное завершение или ошибка;
- апскейл: запуск задания, успешное завершение или ошибка;
- ошибки обработки запросов (с кодом статуса и текстом ошибки).
Что **не** логируется: пароли, cookie `kadr_session`, содержимое фотографий.
Единственное исключение — баннер сгенерированного пароля при первом старте
(когда `APP_PASSWORD` не задан): пароль печатается в лог один раз, чтобы
владелец мог войти.
Уровень логирования задаётся переменной окружения `LOG_LEVEL`:
- `debug` — все сообщения, включая `GET /api/health` и опросы статуса заданий
`GET /api/jobs/:id/status`;
- `info` (по умолчанию) — основные события;
- `warn` — предупреждения;
- `error` — только ошибки.
Примеры строк лога:
```
2026-08-26T06:00:00.000Z [INFO] Сервер запущен {"port":3000,"user":"admin","comfyUrl":"http://192.168.31.240:8188","passwordGenerated":false}
2026-08-26T06:00:01.000Z [INFO] GET /api/history -> 200 2ms
2026-08-26T06:00:05.000Z [INFO] Вход выполнен {"user":"admin"}
2026-08-26T06:00:10.000Z [INFO] Редактирование запущено {"jobId":"...","sourceId":"...","prompt":"..."}
2026-08-26T06:02:30.000Z [INFO] Редактирование завершено {"jobId":"...","ok":true,"exitCode":0,"timedOut":false,"durationMs":140000,"versionId":"...","lastMessage":"..."}
2026-08-26T06:02:31.000Z [WARN] Ошибка обработки запроса {"status":401,"message":"Требуется авторизация."}
```
## Docker
Образ собирается на базе `node:22-bookworm-slim` (Debian, glibc) — Codex CLI