У меня появилась Отличная идея! Создадим свой легкий, но расширяемый OpenSource баг-трекер . Назовем его Bug-Flow.
- Давай напишем легкий багтрекер для размещения на своей ВМ, команда до 10 человек, возможно в качестве микросервисной архитектуры с возможностью обновления конфигурации или расширений функций перезапуском docker compose. Доступ к багтрекеру через веб с авторизацией. Backend - на python (возможно Fast-API), front-end на vue3 (может интегрируем в Astro).
- Давай начнем со структуры и определим основные функциональные модули.
Note
Хочешь внести свой вклад? - присоединяйся и улучшай!
Important
Важно! На сервере должны быть установлены Docker Engine и Docker Compose. Документация по установке Docker Engine на Ubuntu Server см. в статье Установка Docker Engine и Docker Compose на Ubuntu Server.
- Клонируйте репозиторий на сервер.
git clone git@github.com:vasilytray/bug-flow.gitBug-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
/auth
├── Регистрация/вход (email + пароль)
├── JWT токены (access/refresh)
├── Роли: Admin, Project Manager, Developer, Tester, Viewer
├── Права на уровне проектов/задач
└── Сессии и безопасность
/projects
├── Создание/редактирование проектов
├── Участники проекта (роли, приглашения)
├── Настройки проекта (воркфлоу, статусы, приоритеты)
└── Статистика по проекту
/issues
├── CRUD для багов/задач
├── Поля:
│ ├── Название, описание (Markdown)
│ ├── Статус (New, In Progress, Resolved, Closed, Reopened)
│ ├── Приоритет (Critical, High, Medium, Low)
│ ├── Тип (Bug, Feature, Task, Improvement)
│ ├── Назначенный исполнитель
│ ├── Теги/метки
│ ├── Связанные задачи
│ └── Время оценки/фактическое
├── История изменений (audit log)
├── Поиск и фильтры
├── Сортировка
└── Экспорт (JSON, CSV)
/comments
├── Комментарии к задачам (с Markdown)
├── Вложения в комментариях
├── @упоминания пользователей
├── Лента активности по проекту
└── Уведомления об упоминаниях
/attachments
├── Загрузка файлов (скриншоты, логи)
├── Превью изображений
├── Лимиты на размер/типы
└── Хранение в S3/MinIO
/notifications
├── In-app уведомления
├── Email рассылка (новые задачи, изменения)
├── Webhook интеграции (Slack, Telegram)
└── Настройки уведомлений пользователя
/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: datetimeBackend:
- 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.shversion: '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
Предлагаю сделать систему модульной:
- Конфиг в YAML/JSON для каждого сервиса
- Плагины через entry points (как у FastAPI)
- Webhook система для интеграций
- Переменные окружения для 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)
- Индексы для всех внешних ключей
- Частичные индексы для активных данных (
WHERE is_closed = FALSE) - Составные индексы для частых паттернов запросов
- Генерируемые столбцы для часто вычисляемых значений (
is_closed) - Триггеры для поддержания консистентности данных
- Полнотекстовый поиск через
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С этой схемой мы можем:
- Написать модели SQLAlchemy на основе схемы
- Создать Pydantic схемы для валидации
- Реализовать базовый CRUD для каждой сущности
- Настроить миграции Alembic
- Создать сиды для тестовых данных
🐍 Настройка виртуального окружения
- Создаем виртуальное окружение
# Переходим в папку проекта
cd bugf-low/backend
# Создаем виртуальное окружение (выберите один вариант)
python -m venv venv # Стандартный venv# Активируем окружение
# На Windows:
venv\Scripts\activate
# На Linux/Mac:
source venv/bin/activate- Структурированный requirements.txt txt
[!NOTE] Внимание! НЕОБХОДИМО ОБНОВИТЬ ЗАВИСИМОСТИ ДО ПОСЛЕДНИХ ВЕРСИЙ! для: backend/requirements/dev.txt backend/requirements/prod.txt
# Основной файл для установки (разработка)
-r requirements/dev.txt