@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 4 hours ago
brand Add BugTrail logo: extension icons, favicons and popup/options branding 1 day ago
deploy Extension zips: 404 instead of SPA fallback; clear errors in packaging 4 hours ago
packages Extension zips: 404 instead of SPA fallback; clear errors in packaging 4 hours ago
server Report page: swap header buttons, fix back navigation on share links 7 hours ago
.env.example Server: FastAPI backend with auth, projects, reports, uploads 1 day ago
.gitignore Fix .gitignore: trailing comments are not supported, zips entry never matched 6 hours ago
.npmrc Web panel: Vue 3 + gnexus-ui-kit, auth, projects, reports, i18n 1 day ago
Makefile Download page: extension install guide for Chrome and Firefox 6 hours ago
README.md Extension zips: 404 instead of SPA fallback; clear errors in packaging 4 hours ago
docker-compose.prod.yml v0.1.0-beta: production transfer guide and parameterized prod stack 6 hours ago
docker-compose.yml Server: FastAPI backend with auth, projects, reports, uploads 1 day ago
package-lock.json Record silent WebM screen video instead of GIF during recordings 22 hours ago
package.json Rename the service to BugTrail 1 day ago
README.md

BugTrail

Сервис для передачи багов от тестировщиков разработчикам: заметки на элементах страницы со скриншотами и аннотациями, запись алгоритма воспроизведения, веб-панель с неугадываемыми ссылками для Jira.

Состав

Часть Стек Где
Сервер (API) Python 3.13, FastAPI, SQLAlchemy async, Postgres 16, Alembic server/ (Docker)
Веб-панель Vue 3, vue-router, vue-i18n (en/ru), gnexus-ui-kit packages/web
Общий код UI Аннотации на скриншотах, контекст элемента packages/ui
Расширение Chrome + Firefox (MV3), Vite, closed shadow-DOM overlay packages/extension
Общие типы/клиент API TypeScript packages/shared

Быстрый старт

npm install          # workspaces: shared, ui, web, extension
make dev             # postgres + API в docker, панель на http://localhost:5173

API: http://localhost:8001 (healthcheck: /api/healthz). Миграции применяются при старте контейнера; вручную — make migrate.

Расширение

make ext             # сборка в packages/extension/dist/{chrome,firefox}
                     # + zip-архивы в packages/web/public/ext (страница /download)

Пользователям расширение раздаётся через страницу панели /download (пункт меню «Расширение»): архивы для Chrome и Firefox + инструкция по установке и настройке.

Установка (dev):

  • Chrome/Chromium: chrome://extensions → Developer mode → Load unpackedpackages/extension/dist/chrome
  • Firefox: about:debugging#/runtime/this-firefoxLoad Temporary Add-onpackages/extension/dist/firefox/manifest.json

Затем: иконка расширения → Settings (или Alt+Shift+B → контекстное меню настроек не используется, страница настроек открывается из chrome://extensions → Details → Extension options): указать URL сервера, войти (email/пароль), выбрать проект по умолчанию.

Управление:

  • Alt+Shift+B — пикер элемента: клик по элементу → скриншот → аннотации (перо/стрелка/прямоугольник/текст) → комментарий → Submit.
  • Alt+Shift+R — старт/стоп записи: клики, ввод (с дебаунсом 250 мс), переходы по URL; скриншоты ключевых шагов прикладываются автоматически. Кнопка Note в рекордер-баре открывает тот же пикер для заметки на элемент.

Пароли не сохраняются: маскирование ввода дублируется на сервере.

Почему /assets

kit.css из gnexus-ui-kit ссылается на шрифты абсолютными путями /assets/.... Веб-панель копирует ассеты кита в свой dist/assets (dev-миддлварь + vite-plugin-static-copy). Расширение раздаёт их как web_accessible_resources и переписывает пути на chrome-extension://.../assets/... при загрузке стилей в shadow root (constructable stylesheets — CSS хост-страницы и её CSP не затрагиваются).

E2E-проверка расширения

make ext-test (нужен поднятый make dev) — headless Chromium грузит собранное расширение, проходит сценарий «пикер → заметка» и «рекордер: клики + ввод», проверяет репорты через API.

Прод

Стек прод-версии — docker-compose.prod.yml: caddy (статика панели + reverse-proxy /api), API-сервер, Postgres 16. Миграции применяются при старте контейнера сервера автоматически.

Первый перенос на сервер

git clone <repo> && cd live-testing-tool
npm ci
make prod            # сборка панели + up -d --build

Панель и API на одном origin: http://<host>:8081 (caddy: статика + /api → server). Для сборки zip-архивов расширения (страница /download) на сервере должен быть установлен zip (apt install zip и т.п.). Первый зарегистрированный через панель аккаунт — обычный пользователь; проекты создаёт каждый сам, публичные ссылки выдаются на проект и репорт.

Настройки (.env рядом с compose-файлом)

Переменная По умолчанию Назначение
POSTGRES_PASSWORD ltt пароль БД (меняйте на проде)
HTTP_PORT 8081 порт панели на хосте
HTTPS_PORT 8443 порт HTTPS на хосте
SITE_ADDRESS :80 адрес сайта для caddy

Домен + автоматический HTTPS (caddy сам выпустит сертификат). Релизный адрес — https://bugtrail.gnexus.space:

# .env
SITE_ADDRESS=bugtrail.gnexus.space
HTTP_PORT=80
HTTPS_PORT=443

(образец — deploy/.env.example)

Для расширения в настройках указать URL сервера = адрес панели (https://bugtrail.example.com), войти и выбрать проект по умолчанию.

Обновление

git pull
make prod            # пересоберёт панель и контейнеры, накатит миграции

Данные живут в volume postgres_data (БД) и каталоге ./data (файлы скриншотов/видео) — их достаточно для бэкапа: docker compose -f docker-compose.prod.yml exec postgres pg_dump -U ltt ltt > dump.sql плюс копия ./data.

Ссылки и доступ

  • PK — UUIDv7; публичные ссылки — случайные 128-битные токены (/p/<token>, /r/<token>).
  • Токен = авторизация: страницы проекта и репорта открываются без логина.
  • Ротация токена: кнопка в панели (POST .../share/rotate).

Структура

server/app/routers/   auth, projects, reports, uploads
packages/web/src/     pages (Login, Register, Projects, Project, Report, Settings), i18n
packages/ui/src/      AnnotationEditor, ScreenshotViewer, ElementContext, EnvironmentInfo
packages/extension/src/  background (SW: сеть, captureVisibleTab, буфер рекордера),
                         content (shadow-DOM оверлей: PickerLayer, NoteComposer, RecorderBar),
                         options (сервер, логин, проект по умолчанию)