Skip to content

vasilytray/bug-flow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Bug-flow (Баг-трекера для команды)

У меня появилась Отличная идея! Создадим свой легкий, но расширяемый OpenSource баг-трекер . Назовем его Bug-Flow.

  1. Давай напишем легкий багтрекер для размещения на своей ВМ, команда до 10 человек, возможно в качестве микросервисной архитектуры с возможностью обновления конфигурации или расширений функций перезапуском docker compose. Доступ к багтрекеру через веб с авторизацией. Backend - на python (возможно Fast-API), front-end на vue3 (может интегрируем в Astro).
  2. Давай начнем со структуры и определим основные функциональные модули.

Note

Хочешь внести свой вклад? - присоединяйся и улучшай!

Important

Важно! На сервере должны быть установлены Docker Engine и Docker Compose. Документация по установке Docker Engine на Ubuntu Server см. в статье Установка Docker Engine и Docker Compose на Ubuntu Server.

  1. Клонируйте репозиторий на сервер.
git clone git@github.com:vasilytray/bug-flow.git

🏗️ Высокоуровневая архитектура (микросервисы)

Bug-Flow
├── Gateway (nginx/traefik)          # Единая точка входа, SSL, маршрутизация
├── Auth Service                     # Аутентификация/авторизация (JWT)
├── Core Service                     # Основная логика (проекты, задачи, баги)
├── Notification Service             # Уведомления (email, webhook)
├── File Service                     # Загрузка файлов/скриншотов
├── Frontend (Vue3 + Vite)           # SPA приложение
├── PostgreSQL                       # Основная БД
├── Redis                            # Кэш, сессии
└── Monitoring (опционально)         # Prometheus + Grafana

📦 Основные функциональные модули

1. Модуль аутентификации и авторизации

/auth
├── Регистрация/вход (email + пароль)
├── JWT токены (access/refresh)
├── Роли: Admin, Project Manager, Developer, Tester, Viewer
├── Права на уровне проектов/задач
└── Сессии и безопасность

2. Модуль управления проектами

/projects
├── Создание/редактирование проектов
├── Участники проекта (роли, приглашения)
├── Настройки проекта (воркфлоу, статусы, приоритеты)
└── Статистика по проекту

3. Модуль багов/задач (ядро системы)

/issues
├── CRUD для багов/задач
├── Поля:
│   ├── Название, описание (Markdown)
│   ├── Статус (New, In Progress, Resolved, Closed, Reopened)
│   ├── Приоритет (Critical, High, Medium, Low)
│   ├── Тип (Bug, Feature, Task, Improvement)
│   ├── Назначенный исполнитель
│   ├── Теги/метки
│   ├── Связанные задачи
│   └── Время оценки/фактическое
├── История изменений (audit log)
├── Поиск и фильтры
├── Сортировка
└── Экспорт (JSON, CSV)

4. Модуль комментариев и активности

/comments
├── Комментарии к задачам (с Markdown)
├── Вложения в комментариях
├── @упоминания пользователей
├── Лента активности по проекту
└── Уведомления об упоминаниях

5. Модуль вложений

/attachments
├── Загрузка файлов (скриншоты, логи)
├── Превью изображений
├── Лимиты на размер/типы
└── Хранение в S3/MinIO

6. Модуль уведомлений

/notifications
├── In-app уведомления
├── Email рассылка (новые задачи, изменения)
├── Webhook интеграции (Slack, Telegram)
└── Настройки уведомлений пользователя

7. Модуль отчетности

/reports
├── Статистика по проекту
├── Отчеты по эффективности
├── Воронка багов
└── Dashboard с графиками

🗄️ Модель данных (основные сущности)

User:
  id: uuid
  email: string
  username: string
  hashed_password: string
  role: enum
  avatar_url: string
  is_active: boolean

Project:
  id: uuid
  name: string
  description: string
  key: string (проектный ключ, например "BF")
  owner_id: uuid (User)
  settings: jsonb (кастомные статусы, workflow)
  
ProjectMember:
  project_id: uuid
  user_id: uuid
  role: enum (admin, member, viewer)
  
Issue:
  id: uuid
  project_id: uuid
  key: string (например "BF-123")
  title: string
  description: text
  type: enum (bug, feature, task)
  status: enum
  priority: enum
  assignee_id: uuid (User)
  reporter_id: uuid (User)
  estimate_hours: integer
  spent_hours: integer
  tags: string[]
  created_at: datetime
  updated_at: datetime
  
Comment:
  id: uuid
  issue_id: uuid
  author_id: uuid (User)
  content: text
  attachments: uuid[] (ссылки на файлы)
  created_at: datetime
  
Activity:
  id: uuid
  project_id: uuid
  issue_id: uuid (optional)
  user_id: uuid (User)
  action: string (created, updated, commented)
  data: jsonb (изменения)
  created_at: datetime
  
Attachment:
  id: uuid
  filename: string
  original_name: string
  mime_type: string
  size: integer
  url: string
  uploaded_by: uuid (User)
  created_at: datetime

🔧 Технологический стек

Backend:

  • FastAPI (асинхронный, автодокументация OpenAPI)
  • SQLAlchemy 2.0 + Alembic (миграции)
  • Pydantic v2 (валидация)
  • PostgreSQL (основная БД)
  • Redis (кэш, Celery для задач)
  • JWT (авторизация)

Frontend:

  • Vue 3 + Composition API
  • Pinia (state management)
  • Vue Router
  • PrimeVue / Quasar / Element Plus (UI компоненты)
  • Axios (HTTP клиент)
  • Vite (сборка)

Инфраструктура:

  • Docker + Docker Compose
  • Traefik (обратный прокси)
  • MinIO (S3-совместимое хранилище)
  • Celery (фоновые задачи)
  • Prometheus + Grafana (мониторинг)

📁 Структура проекта

Bug-Flow/
├── docker-compose.yml               # Основной файл сборки
├── docker-compose.override.yml      # Конфигурация для разработки
├── .env.example                     # Пример переменных окружения
├── traefik/
│   ├── docker-compose.traefik.yml   # Конфигурация Traefik
│   ├── certs/                       # Директория для SSL сертификатов
│   ├── dynamic/                     # Динамическая конфигурация Traefik
│   └── logs/                        # Логи Traefik
├── backend/
│   ├── app/
│   │   ├── api/
│   │   │   ├── __init__.py
│   │   │   ├── deps.py              # Общие зависимости (JWT, сессии)
│   │   │   └── v1/
│   │   │       ├── __init__.py
│   │   │       └── endpoints/       # Endpoint'ы приложения
│   │   ├── core/
│   │   │   ├── __init__.py
│   │   │   ├── config.py           # Конфигурация (Pydantic Settings)
│   │   │   ├── database.py         # Сессии и миксины SQLAlchemy
│   │   │   └── security.py         # JWT, хеширование паролей
│   │   ├── models/                 # Модели SQLAlchemy 2.0
│   │   ├── schemas/                # Pydantic-схемы
│   │   ├── services/               # Бизнес-логика
│   │   ├── workers/                # Celery задачи
│   │   └── main.py
│   ├── alembic/
│   │   ├── versions/
│   │   ├── env.py
│   │   └── script.py.mako
│   ├── requirements/
│   │   ├── base.txt                # Основные зависимости
│   │   ├── dev.txt                 # Доп. зависимости для разработки
│   │   ├── prod.txt                # Доп. зависимости для продакшена
│   │   └── constraints.txt         # Ограничения версий для стабильности
│   ├── Dockerfile                  # Основной для продакшена
│   ├── Dockerfile.dev              # Для разработки
│   ├── .dockerignore
│   └── pyproject.toml              # Конфигурация линтеров, mypy
├── frontend/
│   ├── public/
│   ├── src/
│   │   ├── components/
│   │   ├── views/
│   │   ├── stores/ (Pinia)
│   │   ├── composables/
│   │   ├── router/
│   │   ├── api/
│   │   └── App.vue
│   ├── Dockerfile
│   ├── package.json
│   └── vite.config.js
└── scripts/                         # Скрипты для развертывания
    ├── init-db.sh
    └── backup.sh

🚀 Минимальный docker-compose.yml

version: '3.8'

services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: bugflow
      POSTGRES_USER: bugflow
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U bugflow"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

  backend:
    build: ./backend
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started
    environment:
      DATABASE_URL: postgresql://bugflow:${DB_PASSWORD}@postgres/bugflow
      REDIS_URL: redis://redis:6379/0
      SECRET_KEY: ${SECRET_KEY}
    volumes:
      - ./backend:/app:ro
    restart: unless-stopped

  frontend:
    build: ./frontend
    depends_on:
      - backend
    restart: unless-stopped

  traefik:
    image: traefik:v3.0
    command:
      - "--api.dashboard=true"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"  # Dashboard
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

volumes:
  postgres_data:
  redis_data:

📈 План реализации (поэтапно)

Этап 1: Foundation (2-3 дня)

  • Базовая настройка Docker Compose
  • FastAPI скелет + модели User/Project
  • Простейшая авторизация (JWT)
  • Vue3 SPA с входом/регистрацией

Этап 2: Core Issues (3-4 дня)

  • CRUD для задач/багов
  • Базовая страница проекта с задачами
  • Фильтры и поиск
  • Комментарии к задачам

Этап 3: Рабочий процесс (2-3 дня)

  • Настройка статусов проекта
  • Назначение задач
  • История изменений
  • Уведомления (in-app)

Этап 4: Расширения (2-3 дня)

  • Вложения файлов
  • Email уведомления
  • API для интеграций
  • Базовые отчеты

Этап 5: Полировка (2-3 дня)

  • UI/UX улучшения
  • Производительность
  • Документация
  • Деплой на VM

🔄 Конфигурация и расширения

Предлагаю сделать систему модульной:

  1. Конфиг в YAML/JSON для каждого сервиса
  2. Плагины через entry points (как у FastAPI)
  3. Webhook система для интеграций
  4. Переменные окружения для sensitive data

Пример конфига проекта:

workflow:
  statuses:
    - name: New
      color: "#3498db"
    - name: In Progress
      color: "#f39c12"
  transitions:
    - from: New
      to: [In Progress, Closed]
  
permissions:
  viewer: [read]
  developer: [read, comment, update_assigned]
  admin: [all]

🗺️ Визуализация связей

users
  ├── projects (owner_id)
  ├── project_members (user_id)
  ├── issues (assignee_id, reporter_id)
  ├── comments (author_id)
  └── notifications (user_id)

projects
  ├── project_members (project_id)
  ├── issues (project_id)
  ├── tags (project_id)
  └── activities (project_id)

issues
  ├── issue_links (source_issue_id, target_issue_id)
  ├── issue_tags (issue_id)
  ├── comments (issue_id)
  ├── attachments (issue_id)
  └── issue_history (issue_id)

📈 Производительность оптимизации

  1. Индексы для всех внешних ключей
  2. Частичные индексы для активных данных (WHERE is_closed = FALSE)
  3. Составные индексы для частых паттернов запросов
  4. Генерируемые столбцы для часто вычисляемых значений (is_closed)
  5. Триггеры для поддержания консистентности данных
  6. Полнотекстовый поиск через tsvector (опционально)

🚀 Миграции

Создадим структуру для Alembic миграций:

# backend/alembic/versions/001_initial_schema.py
"""
Initial database schema for BugFlow
"""

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

def upgrade():
    # Здесь будет код создания всех таблиц
    pass

def downgrade():
    # Откат
    pass

С этой схемой мы можем:

  1. Написать модели SQLAlchemy на основе схемы
  2. Создать Pydantic схемы для валидации
  3. Реализовать базовый CRUD для каждой сущности
  4. Настроить миграции Alembic
  5. Создать сиды для тестовых данных

🐍 Настройка виртуального окружения

  1. Создаем виртуальное окружение
# Переходим в папку проекта
cd bugf-low/backend

# Создаем виртуальное окружение (выберите один вариант)
python -m venv venv  # Стандартный venv
# Активируем окружение
# На Windows:
venv\Scripts\activate
# На Linux/Mac:
source venv/bin/activate
  1. Структурированный requirements.txt txt
backend/requirements/base.txt

[!NOTE] Внимание! НЕОБХОДИМО ОБНОВИТЬ ЗАВИСИМОСТИ ДО ПОСЛЕДНИХ ВЕРСИЙ! для: backend/requirements/dev.txt backend/requirements/prod.txt

backend/requirements.txt

# Основной файл для установки (разработка)
-r requirements/dev.txt

About

Lightweight but extensible OpenSource Bug tracker with microservice architecture based on FastAPI(back-end) and Vue3+Astro(front-end)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors