Delete DEPLOYMENT_GUIDE.md
This commit is contained in:
@@ -1,632 +0,0 @@
|
|||||||
# TechDesk — IT Ticket System
|
|
||||||
## Complete Deployment & Implementation Guide
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Table of Contents
|
|
||||||
1. [Project Structure](#1-project-structure)
|
|
||||||
2. [Prerequisites](#2-prerequisites)
|
|
||||||
3. [Server Setup](#3-server-setup)
|
|
||||||
4. [MySQL Database Setup](#4-mysql-database-setup)
|
|
||||||
5. [Application Deployment](#5-application-deployment)
|
|
||||||
6. [Gunicorn Configuration](#6-gunicorn-configuration)
|
|
||||||
7. [Systemd Service](#7-systemd-service)
|
|
||||||
8. [Nginx Configuration](#8-nginx-configuration)
|
|
||||||
9. [SSL Certificate](#9-ssl-certificate)
|
|
||||||
10. [First Login & Admin Setup](#10-first-login--admin-setup)
|
|
||||||
11. [AI Chatbot Configuration](#11-ai-chatbot-configuration)
|
|
||||||
12. [Email Configuration](#12-email-configuration)
|
|
||||||
13. [Code Change Map](#13-code-change-map)
|
|
||||||
14. [Features Overview](#14-features-overview)
|
|
||||||
15. [Maintenance & Operations](#15-maintenance--operations)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. Project Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
it-ticket-system/
|
|
||||||
├── run.py ← Flask entry point
|
|
||||||
├── gunicorn.conf.py ← Gunicorn worker config
|
|
||||||
├── it-ticket-system.service ← Systemd unit file
|
|
||||||
├── nginx.conf ← Nginx site config
|
|
||||||
├── setup_db.sql ← MySQL DB + user creation
|
|
||||||
├── requirements.txt ← Python dependencies
|
|
||||||
├── .env.example ← Environment variable template
|
|
||||||
├── config/
|
|
||||||
│ └── config.py ← Flask config classes (Dev/Prod)
|
|
||||||
├── app/
|
|
||||||
│ ├── __init__.py ← App factory, extension init, seed admin
|
|
||||||
│ ├── models.py ← All SQLAlchemy models
|
|
||||||
│ ├── routes/
|
|
||||||
│ │ ├── __init__.py
|
|
||||||
│ │ ├── auth.py ← Login, register, logout, profile
|
|
||||||
│ │ ├── tickets.py ← Ticket CRUD, comments, attachments
|
|
||||||
│ │ ├── admin.py ← IT/admin management views
|
|
||||||
│ │ ├── api.py ← JSON API + WebSocket events
|
|
||||||
│ │ └── chatbot.py ← AI assistant endpoint
|
|
||||||
│ ├── services/
|
|
||||||
│ │ ├── __init__.py
|
|
||||||
│ │ ├── notification_service.py ← Email + in-app + WebSocket notifications
|
|
||||||
│ │ └── log_service.py ← Activity log + ticket history helpers
|
|
||||||
│ └── templates/
|
|
||||||
│ ├── base.html ← Sidebar, topbar, chat widget, JS
|
|
||||||
│ ├── auth/
|
|
||||||
│ │ ├── login.html
|
|
||||||
│ │ ├── register.html
|
|
||||||
│ │ └── profile.html
|
|
||||||
│ ├── tickets/
|
|
||||||
│ │ ├── dashboard_employee.html
|
|
||||||
│ │ ├── dashboard_it.html
|
|
||||||
│ │ ├── create.html
|
|
||||||
│ │ ├── list.html
|
|
||||||
│ │ ├── detail.html
|
|
||||||
│ │ ├── notifications.html
|
|
||||||
│ │ ├── knowledge_base.html
|
|
||||||
│ │ └── kb_article.html
|
|
||||||
│ └── admin/
|
|
||||||
│ ├── index.html
|
|
||||||
│ ├── tickets.html
|
|
||||||
│ ├── users.html
|
|
||||||
│ ├── edit_user.html
|
|
||||||
│ ├── kb_list.html
|
|
||||||
│ ├── kb_edit.html
|
|
||||||
│ └── activity_logs.html
|
|
||||||
└── logs/ ← Created automatically at runtime
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Prerequisites
|
|
||||||
|
|
||||||
On your **Ubuntu 22.04** server, ensure the following are installed:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Update system
|
|
||||||
sudo apt update && sudo apt upgrade -y
|
|
||||||
|
|
||||||
# Python 3.10+, pip, venv
|
|
||||||
sudo apt install -y python3 python3-pip python3-venv python3-dev
|
|
||||||
|
|
||||||
# MySQL Server
|
|
||||||
sudo apt install -y mysql-server libmysqlclient-dev
|
|
||||||
|
|
||||||
# Nginx
|
|
||||||
sudo apt install -y nginx
|
|
||||||
|
|
||||||
# Certbot (Let's Encrypt SSL)
|
|
||||||
sudo apt install -y certbot python3-certbot-nginx
|
|
||||||
|
|
||||||
# Build tools (needed for some pip packages)
|
|
||||||
sudo apt install -y build-essential libssl-dev libffi-dev
|
|
||||||
|
|
||||||
# (Optional) Git for deployment
|
|
||||||
sudo apt install -y git
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Server Setup
|
|
||||||
|
|
||||||
### 3.1 Create Application User & Directory
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Create a dedicated system user
|
|
||||||
sudo useradd --system --no-create-home --shell /bin/false it-tickets
|
|
||||||
|
|
||||||
# Create application directory
|
|
||||||
sudo mkdir -p /var/www/it-ticket-system
|
|
||||||
sudo chown it-tickets:www-data /var/www/it-ticket-system
|
|
||||||
sudo chmod 755 /var/www/it-ticket-system
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3.2 Deploy Application Files
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Option A: Clone from your Git repository
|
|
||||||
sudo -u it-tickets git clone https://your-repo-url.git /var/www/it-ticket-system
|
|
||||||
|
|
||||||
# Option B: Upload manually via scp
|
|
||||||
scp -r ./it-ticket-system/* user@your-server:/var/www/it-ticket-system/
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3.3 Create Python Virtual Environment
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /var/www/it-ticket-system
|
|
||||||
|
|
||||||
sudo -u it-tickets python3 -m venv venv
|
|
||||||
sudo -u it-tickets venv/bin/pip install --upgrade pip
|
|
||||||
sudo -u it-tickets venv/bin/pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3.4 Create Upload & Log Directories
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo -u it-tickets mkdir -p /var/www/it-ticket-system/app/static/uploads
|
|
||||||
sudo -u it-tickets mkdir -p /var/www/it-ticket-system/logs
|
|
||||||
|
|
||||||
# Ensure www-data (nginx) can read uploads
|
|
||||||
sudo chown -R it-tickets:www-data /var/www/it-ticket-system/app/static/uploads
|
|
||||||
sudo chmod -R 775 /var/www/it-ticket-system/app/static/uploads
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. MySQL Database Setup
|
|
||||||
|
|
||||||
### 4.1 Secure MySQL Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo mysql_secure_installation
|
|
||||||
# Follow prompts: set root password, remove anonymous users,
|
|
||||||
# disallow remote root login, remove test database.
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4.2 Create Database and User
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Run the provided SQL setup script
|
|
||||||
sudo mysql -u root -p < /var/www/it-ticket-system/setup_db.sql
|
|
||||||
|
|
||||||
# Or manually:
|
|
||||||
sudo mysql -u root -p <<'EOF'
|
|
||||||
CREATE DATABASE IF NOT EXISTS it_tickets CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
||||||
CREATE USER IF NOT EXISTS 'it_tickets_user'@'localhost' IDENTIFIED BY 'YOUR_SECURE_PASSWORD';
|
|
||||||
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, REFERENCES
|
|
||||||
ON it_tickets.* TO 'it_tickets_user'@'localhost';
|
|
||||||
FLUSH PRIVILEGES;
|
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4.3 Verify Connection
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mysql -u it_tickets_user -p it_tickets
|
|
||||||
# Should connect without errors. Type \q to exit.
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. Application Deployment
|
|
||||||
|
|
||||||
### 5.1 Configure Environment Variables
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Copy the example env file
|
|
||||||
sudo -u it-tickets cp /var/www/it-ticket-system/.env.example /var/www/it-ticket-system/.env
|
|
||||||
|
|
||||||
# Edit with your actual values
|
|
||||||
sudo nano /var/www/it-ticket-system/.env
|
|
||||||
```
|
|
||||||
|
|
||||||
**Critical values to change in `.env`:**
|
|
||||||
|
|
||||||
```ini
|
|
||||||
# Generate a strong secret key:
|
|
||||||
# python3 -c "import secrets; print(secrets.token_hex(32))"
|
|
||||||
SECRET_KEY=your-generated-secret-key
|
|
||||||
|
|
||||||
# Database — match what you set in setup_db.sql
|
|
||||||
DB_PASSWORD=YOUR_SECURE_PASSWORD
|
|
||||||
|
|
||||||
# Mail — your SMTP server credentials
|
|
||||||
MAIL_SERVER=smtp.yourdomain.com
|
|
||||||
MAIL_USERNAME=ittickets@yourdomain.com
|
|
||||||
MAIL_PASSWORD=your-email-password
|
|
||||||
IT_DEPT_EMAIL=it-department@yourdomain.com
|
|
||||||
|
|
||||||
# Public URL of your app
|
|
||||||
APP_BASE_URL=https://tickets.yourdomain.com
|
|
||||||
|
|
||||||
# Anthropic API key for AI chatbot
|
|
||||||
ANTHROPIC_API_KEY=sk-ant-...
|
|
||||||
|
|
||||||
# Change default admin password
|
|
||||||
ADMIN_EMAIL=admin@yourdomain.com
|
|
||||||
ADMIN_PASSWORD=YourStrongAdminPassword!
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5.2 Initialize the Database
|
|
||||||
|
|
||||||
The application automatically creates all tables and seeds the admin user on first startup. You can also trigger it manually:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /var/www/it-ticket-system
|
|
||||||
sudo -u it-tickets venv/bin/python -c "
|
|
||||||
from app import create_app, db
|
|
||||||
app = create_app('production')
|
|
||||||
with app.app_context():
|
|
||||||
db.create_all()
|
|
||||||
print('Database tables created successfully.')
|
|
||||||
"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5.3 Set File Permissions
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Application files: readable by the app user
|
|
||||||
sudo find /var/www/it-ticket-system -type f -exec chmod 644 {} \;
|
|
||||||
sudo find /var/www/it-ticket-system -type d -exec chmod 755 {} \;
|
|
||||||
sudo chmod 600 /var/www/it-ticket-system/.env
|
|
||||||
sudo chown it-tickets:it-tickets /var/www/it-ticket-system/.env
|
|
||||||
|
|
||||||
# Virtual environment executables
|
|
||||||
sudo chmod +x /var/www/it-ticket-system/venv/bin/gunicorn
|
|
||||||
sudo chmod +x /var/www/it-ticket-system/venv/bin/python
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. Gunicorn Configuration
|
|
||||||
|
|
||||||
The `gunicorn.conf.py` file at the project root controls the WSGI server.
|
|
||||||
|
|
||||||
**Key settings explained:**
|
|
||||||
|
|
||||||
| Setting | Value | Reason |
|
|
||||||
|---|---|---|
|
|
||||||
| `worker_class` | `eventlet` | Required for Flask-SocketIO WebSocket support |
|
|
||||||
| `workers` | `1` | eventlet mandates a single worker |
|
|
||||||
| `worker_connections` | `1000` | Max concurrent connections per worker |
|
|
||||||
| `timeout` | `120` | Seconds before killing an unresponsive worker |
|
|
||||||
| `bind` | `127.0.0.1:5000` | Internal only — nginx proxies publicly |
|
|
||||||
|
|
||||||
**Test Gunicorn manually before enabling the service:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /var/www/it-ticket-system
|
|
||||||
sudo -u it-tickets venv/bin/gunicorn --config gunicorn.conf.py run:app
|
|
||||||
|
|
||||||
# You should see: [INFO] Listening at: http://127.0.0.1:5000
|
|
||||||
# Press Ctrl+C to stop.
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. Systemd Service
|
|
||||||
|
|
||||||
### 7.1 Install the Service
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Copy unit file to systemd
|
|
||||||
sudo cp /var/www/it-ticket-system/it-ticket-system.service /etc/systemd/system/
|
|
||||||
|
|
||||||
# Edit to confirm paths and user match your setup
|
|
||||||
sudo nano /etc/systemd/system/it-ticket-system.service
|
|
||||||
```
|
|
||||||
|
|
||||||
**Update these lines in the service file if needed:**
|
|
||||||
|
|
||||||
```ini
|
|
||||||
User=it-tickets
|
|
||||||
Group=www-data
|
|
||||||
WorkingDirectory=/var/www/it-ticket-system
|
|
||||||
EnvironmentFile=/var/www/it-ticket-system/.env
|
|
||||||
ExecStart=/var/www/it-ticket-system/venv/bin/gunicorn \
|
|
||||||
--config gunicorn.conf.py \
|
|
||||||
run:app
|
|
||||||
```
|
|
||||||
|
|
||||||
### 7.2 Enable and Start the Service
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl daemon-reload
|
|
||||||
sudo systemctl enable it-ticket-system
|
|
||||||
sudo systemctl start it-ticket-system
|
|
||||||
|
|
||||||
# Verify it is running
|
|
||||||
sudo systemctl status it-ticket-system
|
|
||||||
```
|
|
||||||
|
|
||||||
### 7.3 Useful Service Commands
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# View live logs
|
|
||||||
sudo journalctl -u it-ticket-system -f
|
|
||||||
|
|
||||||
# Restart after code changes
|
|
||||||
sudo systemctl restart it-ticket-system
|
|
||||||
|
|
||||||
# Stop the service
|
|
||||||
sudo systemctl stop it-ticket-system
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. Nginx Configuration
|
|
||||||
|
|
||||||
### 8.1 Install Site Configuration
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Copy nginx config
|
|
||||||
sudo cp /var/www/it-ticket-system/nginx.conf /etc/nginx/sites-available/it-ticket-system
|
|
||||||
|
|
||||||
# Edit: replace tickets.yourdomain.com with your actual domain
|
|
||||||
sudo nano /etc/nginx/sites-available/it-ticket-system
|
|
||||||
|
|
||||||
# Enable the site
|
|
||||||
sudo ln -s /etc/nginx/sites-available/it-ticket-system /etc/nginx/sites-enabled/
|
|
||||||
|
|
||||||
# Remove default nginx site (optional)
|
|
||||||
sudo rm -f /etc/nginx/sites-enabled/default
|
|
||||||
|
|
||||||
# Test configuration syntax
|
|
||||||
sudo nginx -t
|
|
||||||
|
|
||||||
# Reload nginx
|
|
||||||
sudo systemctl reload nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
### 8.2 Nginx Tuning (Optional)
|
|
||||||
|
|
||||||
Add to `/etc/nginx/nginx.conf` inside the `http {}` block:
|
|
||||||
|
|
||||||
```nginx
|
|
||||||
# Increase for large file uploads
|
|
||||||
client_max_body_size 20M;
|
|
||||||
|
|
||||||
# Gzip compression
|
|
||||||
gzip on;
|
|
||||||
gzip_vary on;
|
|
||||||
gzip_min_length 1000;
|
|
||||||
gzip_types text/plain text/css application/json application/javascript text/xml;
|
|
||||||
|
|
||||||
# Rate limiting
|
|
||||||
limit_req_zone $binary_remote_addr zone=app:10m rate=30r/m;
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. SSL Certificate
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Obtain Let's Encrypt certificate
|
|
||||||
sudo certbot --nginx -d tickets.yourdomain.com
|
|
||||||
|
|
||||||
# Certbot will automatically update your nginx config with SSL settings.
|
|
||||||
# Verify auto-renewal:
|
|
||||||
sudo certbot renew --dry-run
|
|
||||||
|
|
||||||
# The nginx.conf provided already has the SSL block commented out.
|
|
||||||
# After certbot runs, it will populate the ssl_certificate paths automatically.
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 10. First Login & Admin Setup
|
|
||||||
|
|
||||||
1. Open your browser: `https://tickets.yourdomain.com`
|
|
||||||
2. Log in with the credentials you set in `.env`:
|
|
||||||
- **Email:** `admin@yourdomain.com`
|
|
||||||
- **Password:** `YourStrongAdminPassword!`
|
|
||||||
3. **Change the admin password immediately** via Profile → Change Password.
|
|
||||||
4. Navigate to **Admin → Users** to create IT Staff accounts.
|
|
||||||
5. Set their role to `it_staff` or `admin`.
|
|
||||||
|
|
||||||
### Default Roles
|
|
||||||
|
|
||||||
| Role | Capabilities |
|
|
||||||
|---|---|
|
|
||||||
| `employee` | Create tickets, add comments, view own tickets, use chatbot, read KB |
|
|
||||||
| `it_staff` | All employee permissions + view/update all tickets, assign tickets, internal notes, manage KB |
|
|
||||||
| `admin` | All IT staff permissions + manage users, view full activity logs, deactivate accounts |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 11. AI Chatbot Configuration
|
|
||||||
|
|
||||||
The chatbot uses the **Anthropic Claude API** (`claude-sonnet-4-20250514`).
|
|
||||||
|
|
||||||
1. Obtain an API key from [console.anthropic.com](https://console.anthropic.com)
|
|
||||||
2. Add to `.env`:
|
|
||||||
```ini
|
|
||||||
ANTHROPIC_API_KEY=sk-ant-api03-...
|
|
||||||
```
|
|
||||||
3. Restart the service: `sudo systemctl restart it-ticket-system`
|
|
||||||
|
|
||||||
**Chatbot capabilities:**
|
|
||||||
- Conversationally gathers issue details from employees
|
|
||||||
- Automatically creates tickets with appropriate category and priority
|
|
||||||
- Notifies IT staff immediately upon ticket creation
|
|
||||||
- Answers general IT questions without creating tickets
|
|
||||||
- Detects critical/urgent language and escalates priority accordingly
|
|
||||||
|
|
||||||
If `ANTHROPIC_API_KEY` is not set, the chatbot gracefully informs users to contact IT directly — **the rest of the application continues to function normally.**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 12. Email Configuration
|
|
||||||
|
|
||||||
### Gmail / Google Workspace
|
|
||||||
|
|
||||||
```ini
|
|
||||||
MAIL_SERVER=smtp.gmail.com
|
|
||||||
MAIL_PORT=587
|
|
||||||
MAIL_USE_TLS=True
|
|
||||||
MAIL_USERNAME=ittickets@yourdomain.com
|
|
||||||
MAIL_PASSWORD=your-app-password # Use App Password, not account password
|
|
||||||
```
|
|
||||||
|
|
||||||
### Microsoft 365 / Outlook
|
|
||||||
|
|
||||||
```ini
|
|
||||||
MAIL_SERVER=smtp.office365.com
|
|
||||||
MAIL_PORT=587
|
|
||||||
MAIL_USE_TLS=True
|
|
||||||
MAIL_USERNAME=ittickets@yourdomain.com
|
|
||||||
MAIL_PASSWORD=your-password
|
|
||||||
```
|
|
||||||
|
|
||||||
### Local Postfix (no external relay)
|
|
||||||
|
|
||||||
```ini
|
|
||||||
MAIL_SERVER=localhost
|
|
||||||
MAIL_PORT=25
|
|
||||||
MAIL_USE_TLS=False
|
|
||||||
MAIL_USERNAME=
|
|
||||||
MAIL_PASSWORD=
|
|
||||||
```
|
|
||||||
|
|
||||||
**Email notifications are sent for:**
|
|
||||||
- New ticket created → IT Department email + all IT staff (in-app)
|
|
||||||
- Ticket status changed → Ticket creator
|
|
||||||
- Ticket assigned → Assigned IT staff member
|
|
||||||
- New comment added → Ticket creator + assignee
|
|
||||||
|
|
||||||
If email fails (wrong credentials, network issue), errors are **logged silently** — the ticket operation still succeeds.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 13. Code Change Map
|
|
||||||
|
|
||||||
This section documents every file and what was added/changed, as a reference for future modifications.
|
|
||||||
|
|
||||||
### New Files (All files are new — this is a greenfield application)
|
|
||||||
|
|
||||||
| File | Purpose | Key Functions/Routes |
|
|
||||||
|---|---|---|
|
|
||||||
| `run.py` | Entry point | Starts Flask + SocketIO |
|
|
||||||
| `config/config.py` | Environment config | `Config`, `DevelopmentConfig`, `ProductionConfig` |
|
|
||||||
| `app/__init__.py` | App factory | `create_app()`, `_seed_admin()` |
|
|
||||||
| `app/models.py` | Database models | `User`, `Ticket`, `Comment`, `Attachment`, `Notification`, `TicketHistory`, `ActivityLog`, `KnowledgeBase` |
|
|
||||||
| `app/routes/auth.py` | Authentication | `GET/POST /auth/login`, `GET/POST /auth/register`, `GET /auth/logout`, `GET/POST /auth/profile` |
|
|
||||||
| `app/routes/tickets.py` | Ticket management | `GET/POST /tickets/new`, `GET /tickets`, `GET/POST /tickets/<id>`, `POST /tickets/<id>/update`, `POST /comments/<id>/delete`, `GET /attachments/<id>`, `GET/POST /notifications`, `GET /kb`, `GET /kb/<id>` |
|
|
||||||
| `app/routes/admin.py` | Admin/IT views | `GET /admin/`, `GET /admin/tickets`, `GET /admin/users`, `GET/POST /admin/users/<id>/edit`, `POST /admin/users/<id>/delete`, KB CRUD, `GET /admin/logs` |
|
|
||||||
| `app/routes/api.py` | JSON API + WebSocket | `GET /api/notifications/unread-count`, `POST /api/notifications/<id>/read`, `POST /api/notifications/mark-all-read`, `GET /api/stats/tickets`, Socket events: `connect`, `disconnect`, `join_ticket`, `leave_ticket` |
|
|
||||||
| `app/routes/chatbot.py` | AI assistant | `POST /chatbot/message` |
|
|
||||||
| `app/services/notification_service.py` | Notification delivery | `create_notification()`, `send_email()`, `notify_new_ticket()`, `notify_status_change()`, `notify_comment_added()`, `notify_assignment()` |
|
|
||||||
| `app/services/log_service.py` | Audit logging | `log_action()`, `log_ticket_history()` |
|
|
||||||
| `gunicorn.conf.py` | WSGI server config | eventlet worker, bind address, log paths |
|
|
||||||
| `it-ticket-system.service` | Systemd unit | Auto-start, restart-on-failure |
|
|
||||||
| `nginx.conf` | Reverse proxy | SSL termination, WebSocket upgrade, static file serving |
|
|
||||||
| `setup_db.sql` | DB initialisation | Creates database, user, grants |
|
|
||||||
|
|
||||||
### Where Logging (`log_action`) Is Called
|
|
||||||
|
|
||||||
| Event | File | Function | Log Action String |
|
|
||||||
|---|---|---|---|
|
|
||||||
| User login | `auth.py` | `login()` | `user_login` |
|
|
||||||
| User registration | `auth.py` | `register()` | `user_register` |
|
|
||||||
| User logout | `auth.py` | `logout()` | `user_logout` |
|
|
||||||
| Profile update | `auth.py` | `profile()` | `user_profile_update` |
|
|
||||||
| Ticket created | `tickets.py` | `create_ticket()` | `ticket_create` |
|
|
||||||
| Ticket updated | `tickets.py` | `update_ticket()` | `ticket_update` |
|
|
||||||
| Comment created | `tickets.py` | `ticket_detail()` | `comment_create` |
|
|
||||||
| Comment deleted | `tickets.py` | `delete_comment()` | `comment_delete` |
|
|
||||||
| Ticket created via chatbot | `chatbot.py` | `chat()` | `ticket_create_chatbot` |
|
|
||||||
| Admin edits user | `admin.py` | `edit_user()` | `admin_user_edit` |
|
|
||||||
| Admin deactivates user | `admin.py` | `delete_user()` | `admin_user_deactivate` |
|
|
||||||
| KB article created | `admin.py` | `kb_new()` | `kb_create` |
|
|
||||||
| KB article edited | `admin.py` | `kb_edit()` | `kb_edit` |
|
|
||||||
| KB article deleted | `admin.py` | `kb_delete()` | `kb_delete` |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 14. Features Overview
|
|
||||||
|
|
||||||
### Employee Features
|
|
||||||
- **Dashboard** — open/active/resolved ticket counts, recent tickets, top KB articles
|
|
||||||
- **Submit Ticket** — form with title, category, priority, location, asset tag, file attachments
|
|
||||||
- **AI Chatbot** — floating chat widget (🤖 button, bottom-right); conversationally creates tickets
|
|
||||||
- **Ticket Tracking** — full ticket detail with comment thread, change history, attachments
|
|
||||||
- **Notifications** — real-time bell (WebSocket) + notification centre page
|
|
||||||
- **Knowledge Base** — self-service articles before submitting a ticket
|
|
||||||
- **Profile** — update name/department/phone, toggle email/web notifications, change password
|
|
||||||
|
|
||||||
### IT Staff Features
|
|
||||||
- **IT Dashboard** — queue metrics (open/in-progress/pending/resolved), assigned tickets, recent activity
|
|
||||||
- **All Tickets View** — filterable by status, priority, assignment (mine/unassigned/all)
|
|
||||||
- **Ticket Update Panel** — change status, priority, assignee, due date, resolution notes, internal notes
|
|
||||||
- **Internal Notes** — IT-only comments not visible to the employee
|
|
||||||
- **Ticket History** — field-level change log on every ticket
|
|
||||||
- **Knowledge Base Management** — create, edit, publish/unpublish, delete articles
|
|
||||||
|
|
||||||
### Admin Features
|
|
||||||
- **User Management** — list all users, edit role/department/status, reset passwords, deactivate
|
|
||||||
- **Activity Log** — full audit trail of all create/update/delete actions with IP addresses
|
|
||||||
- **IT Overview** — aggregate stats across all tickets and users
|
|
||||||
|
|
||||||
### Technical Features
|
|
||||||
- **Real-time WebSocket** — notifications pushed instantly via Flask-SocketIO / eventlet
|
|
||||||
- **Email Notifications** — HTML emails for new tickets, status changes, comments, assignments
|
|
||||||
- **File Attachments** — on tickets and comments; UUID-stored filenames prevent collisions
|
|
||||||
- **Ticket Numbering** — sequential daily format: `TKT-20240315-0001`
|
|
||||||
- **Audit Trail** — every significant action persisted to `activity_logs` + `ticket_history`
|
|
||||||
- **AI Ticket Creation** — chatbot flags `ai_generated=True` on auto-created tickets
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 15. Maintenance & Operations
|
|
||||||
|
|
||||||
### Application Logs
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Application logs (Flask)
|
|
||||||
tail -f /var/www/it-ticket-system/logs/it_tickets.log
|
|
||||||
|
|
||||||
# Gunicorn access log
|
|
||||||
tail -f /var/www/it-ticket-system/logs/gunicorn_access.log
|
|
||||||
|
|
||||||
# Gunicorn error log
|
|
||||||
tail -f /var/www/it-ticket-system/logs/gunicorn_error.log
|
|
||||||
|
|
||||||
# Systemd journal
|
|
||||||
sudo journalctl -u it-ticket-system -f --since "1 hour ago"
|
|
||||||
|
|
||||||
# Nginx logs
|
|
||||||
sudo tail -f /var/log/nginx/it_tickets_access.log
|
|
||||||
sudo tail -f /var/log/nginx/it_tickets_error.log
|
|
||||||
```
|
|
||||||
|
|
||||||
### Deploying Code Updates
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /var/www/it-ticket-system
|
|
||||||
|
|
||||||
# Pull latest code
|
|
||||||
sudo -u it-tickets git pull origin main
|
|
||||||
|
|
||||||
# Install any new dependencies
|
|
||||||
sudo -u it-tickets venv/bin/pip install -r requirements.txt
|
|
||||||
|
|
||||||
# Apply database migrations (if you add Flask-Migrate)
|
|
||||||
# sudo -u it-tickets venv/bin/flask db upgrade
|
|
||||||
|
|
||||||
# Restart the service
|
|
||||||
sudo systemctl restart it-ticket-system
|
|
||||||
sudo systemctl status it-ticket-system
|
|
||||||
```
|
|
||||||
|
|
||||||
### Database Backup
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Full backup
|
|
||||||
mysqldump -u it_tickets_user -p it_tickets > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
||||||
|
|
||||||
# Automated daily backup via cron (add to root's crontab):
|
|
||||||
# 0 2 * * * mysqldump -u it_tickets_user -pPASSWORD it_tickets | gzip > /backups/it_tickets_$(date +\%Y\%m\%d).sql.gz
|
|
||||||
```
|
|
||||||
|
|
||||||
### Firewall Configuration
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ufw allow 22/tcp # SSH
|
|
||||||
sudo ufw allow 80/tcp # HTTP (redirects to HTTPS)
|
|
||||||
sudo ufw allow 443/tcp # HTTPS
|
|
||||||
sudo ufw deny 5000/tcp # Block direct Gunicorn access
|
|
||||||
sudo ufw enable
|
|
||||||
sudo ufw status
|
|
||||||
```
|
|
||||||
|
|
||||||
### Troubleshooting Quick Reference
|
|
||||||
|
|
||||||
| Symptom | Likely Cause | Fix |
|
|
||||||
|---|---|---|
|
|
||||||
| 502 Bad Gateway | Gunicorn not running | `sudo systemctl restart it-ticket-system` |
|
|
||||||
| WebSocket not connecting | nginx missing upgrade headers | Verify `/socket.io/` location block in nginx.conf |
|
|
||||||
| Emails not sending | SMTP credentials | Check `.env` MAIL_* values; test with `flask shell` |
|
|
||||||
| Chatbot not responding | Missing API key | Set `ANTHROPIC_API_KEY` in `.env` and restart |
|
|
||||||
| File uploads failing | Wrong permissions on uploads dir | `sudo chown -R it-tickets:www-data app/static/uploads` |
|
|
||||||
| DB connection error | Wrong credentials | Verify `DB_*` values in `.env` match `setup_db.sql` |
|
|
||||||
| Static files 404 | Wrong nginx alias | Check `alias` path in nginx `/static/` block |
|
|
||||||
Reference in New Issue
Block a user