319 lines
7.4 KiB
Markdown
319 lines
7.4 KiB
Markdown
# TicketHub - Installation Guide
|
|
|
|
## Overview
|
|
|
|
TicketHub is a lightweight, enterprise-grade open-source ticket and issue tracking system. It provides project management, Kanban boards, team collaboration, and integrations with popular platforms.
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────┐ ┌──────────────┐ ┌────────────┐
|
|
│ Frontend │────▶│ Backend │────▶│ SQLite / │
|
|
│ React + Vite │ │ (FastAPI) │ │ PostgreSQL │
|
|
│ (or static) │ │ Python 3.11 │ └────────────┘
|
|
└─────────────────┘ └──────────────┘
|
|
```
|
|
|
|
### Tech Stack
|
|
|
|
**Backend:**
|
|
- Python 3.11 + FastAPI
|
|
- SQLite (development) / PostgreSQL (production)
|
|
- Async architecture (aiosqlite)
|
|
- RESTful API with auto-generated docs
|
|
|
|
**Frontend (React - recommended):**
|
|
- React 18 + TypeScript + Vite
|
|
- TailwindCSS
|
|
- React Query (data fetching)
|
|
- React Router (SPA routing)
|
|
|
|
**Frontend (Static - legacy):**
|
|
- Vanilla HTML/JS + Tailwind CDN
|
|
- Zero build step required
|
|
- Located in `frontend/static/`
|
|
|
|
---
|
|
|
|
## Prerequisites
|
|
|
|
- Python 3.11+
|
|
- Node.js 18+ (for React frontend)
|
|
- Docker (for containerized deployment)
|
|
|
|
---
|
|
|
|
## Quick Start (Local Development)
|
|
|
|
### 1. Clone the repository
|
|
|
|
```bash
|
|
git clone https://gitea.startdata.com.br/startdata/tickethub.git
|
|
cd tickethub
|
|
```
|
|
|
|
### 2. Start the backend
|
|
|
|
```bash
|
|
cd backend
|
|
pip install -r requirements.txt
|
|
uvicorn app.main:app --reload --port 8000
|
|
```
|
|
|
|
The API is now available at http://localhost:8000
|
|
|
|
### 3. Start the frontend (React)
|
|
|
|
```bash
|
|
cd frontend
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
Frontend dev server runs at http://localhost:5173
|
|
|
|
### 4. Access
|
|
|
|
- **App:** http://localhost:5173
|
|
- **API Docs:** http://localhost:8000/docs
|
|
- **Health:** http://localhost:8000/api/health
|
|
|
|
---
|
|
|
|
## Production Deployment (Docker Swarm + Traefik)
|
|
|
|
### 1. Stack file
|
|
|
|
```yaml
|
|
version: "3.8"
|
|
|
|
services:
|
|
tickethub:
|
|
image: python:3.11-slim
|
|
working_dir: /app
|
|
command: >
|
|
bash -c "
|
|
apt-get update && apt-get install -y git --no-install-recommends &&
|
|
git clone https://gitea.yourdomain.com/org/tickethub.git /app/repo &&
|
|
cd /app/repo/backend &&
|
|
pip install --no-cache-dir -r requirements.txt &&
|
|
mkdir -p /data &&
|
|
DATABASE_PATH=/data/tickethub.db uvicorn app.main:app --host 0.0.0.0 --port 8000
|
|
"
|
|
environment:
|
|
- DATABASE_PATH=/data/tickethub.db
|
|
volumes:
|
|
- tickethub_data:/data
|
|
networks:
|
|
- traefik_public
|
|
deploy:
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.tickethub.rule=Host(`tickethub.yourdomain.com`)
|
|
- traefik.http.routers.tickethub.entrypoints=websecure
|
|
- traefik.http.routers.tickethub.tls.certresolver=le
|
|
- traefik.http.services.tickethub.loadbalancer.server.port=8000
|
|
|
|
volumes:
|
|
tickethub_data:
|
|
|
|
networks:
|
|
traefik_public:
|
|
external: true
|
|
```
|
|
|
|
### 2. Deploy
|
|
|
|
```bash
|
|
docker stack deploy -c docker-compose.yml tickethub
|
|
```
|
|
|
|
---
|
|
|
|
## Docker Compose (Simple)
|
|
|
|
```yaml
|
|
version: "3.8"
|
|
|
|
services:
|
|
tickethub:
|
|
build: ./backend
|
|
ports:
|
|
- "8080:8000"
|
|
volumes:
|
|
- tickethub_data:/data
|
|
- ./frontend/static:/app/static:ro
|
|
environment:
|
|
- DATABASE_PATH=/data/tickethub.db
|
|
restart: unless-stopped
|
|
|
|
volumes:
|
|
tickethub_data:
|
|
```
|
|
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
### Projects
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/projects` | List all projects |
|
|
| POST | `/api/projects` | Create project |
|
|
| GET | `/api/projects/:id` | Get project details |
|
|
| PATCH | `/api/projects/:id` | Update project |
|
|
| DELETE | `/api/projects/:id` | Delete project |
|
|
|
|
### Tickets
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/tickets` | List tickets (filter by project_id, status) |
|
|
| POST | `/api/tickets` | Create ticket |
|
|
| GET | `/api/tickets/:id` | Get ticket details |
|
|
| PATCH | `/api/tickets/:id` | Update ticket |
|
|
| DELETE | `/api/tickets/:id` | Delete ticket |
|
|
| GET | `/api/tickets/:id/comments` | List comments |
|
|
| POST | `/api/tickets/:id/comments` | Add comment |
|
|
|
|
### Webhooks
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| POST | `/api/webhooks/incoming` | Receive external webhook |
|
|
|
|
### Health
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/health` | Health check |
|
|
|
|
Full API documentation available at `/docs` (Swagger UI).
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
| Variable | Required | Default | Description |
|
|
|----------|----------|---------|-------------|
|
|
| `DATABASE_PATH` | No | `./tickethub.db` | SQLite database file path |
|
|
| `DATABASE_URL` | No | - | PostgreSQL URL (overrides SQLite) |
|
|
|
|
### Project Configuration
|
|
|
|
Each project supports:
|
|
- **Name** — Display name
|
|
- **Key** — Unique 2-10 character uppercase key (e.g., `PROJ`)
|
|
- **Webhook URL** — External webhook for ticket events
|
|
|
|
### Ticket Fields
|
|
|
|
| Field | Type | Values |
|
|
|-------|------|--------|
|
|
| `title` | string | Required |
|
|
| `description` | string | Required |
|
|
| `status` | enum | `open`, `in_progress`, `resolved`, `closed` |
|
|
| `priority` | enum | `low`, `medium`, `high`, `critical` |
|
|
| `project_id` | integer | Required |
|
|
|
|
---
|
|
|
|
## Frontend Pages (React)
|
|
|
|
| Page | Route | Description |
|
|
|------|-------|-------------|
|
|
| Dashboard | `/` | KPIs, recent activity, overview |
|
|
| Tickets | `/tickets` | List with filters, search, bulk actions |
|
|
| New Ticket | `/tickets/new` | Create ticket form |
|
|
| Ticket Detail | `/tickets/:id` | Full detail view with comments |
|
|
| Kanban Board | `/board` | Drag-and-drop board |
|
|
| Projects | `/projects` | Project management |
|
|
| Team | `/team` | Team members |
|
|
| Reports | `/reports` | Analytics and metrics |
|
|
| Integrations | `/integrations` | External service connections |
|
|
| Automation | `/automation` | Rules engine |
|
|
| Settings | `/settings` | System configuration |
|
|
|
|
---
|
|
|
|
## Building for Production
|
|
|
|
### Frontend Build
|
|
|
|
```bash
|
|
cd frontend
|
|
npm install
|
|
npm run build
|
|
# Output in frontend/dist/
|
|
```
|
|
|
|
### Backend Dockerfile
|
|
|
|
```dockerfile
|
|
FROM python:3.11-slim
|
|
WORKDIR /app
|
|
COPY backend/ .
|
|
RUN pip install --no-cache-dir -r requirements.txt
|
|
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
```
|
|
|
|
---
|
|
|
|
## Webhooks
|
|
|
|
### Incoming Webhooks
|
|
|
|
TicketHub can receive webhooks from external systems to automatically create tickets:
|
|
|
|
```bash
|
|
curl -X POST https://tickethub.yourdomain.com/api/webhooks/incoming \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"project_key": "PROJ",
|
|
"title": "Server Down",
|
|
"description": "Production server is unreachable",
|
|
"priority": "critical",
|
|
"source": "monitoring"
|
|
}'
|
|
```
|
|
|
|
### Outgoing Webhooks
|
|
|
|
Configure a webhook URL per project. TicketHub will POST events when tickets are created or updated:
|
|
|
|
```json
|
|
{
|
|
"event": "ticket.created",
|
|
"ticket": {
|
|
"id": 1,
|
|
"key": "PROJ-1",
|
|
"title": "Server Down",
|
|
"status": "open",
|
|
"priority": "critical"
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Documentation
|
|
|
|
Additional documentation in the `docs/` folder:
|
|
|
|
- **[Architecture](docs/ARCHITECTURE.md)** — System design and data flow
|
|
- **[Developer Guide](docs/DEVELOPER_GUIDE.md)** — Contributing and extending
|
|
- **[User Guide](docs/USER_GUIDE.md)** — End-user documentation
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
MIT © StartData
|