This commit implements all remaining polish tasks (T193-T210) to make the application production-ready. ## Logging & Monitoring (T193, T194, T208, T209) - Add structured JSON logging for production environments - Add human-readable logging for development - Implement comprehensive error logging across all routes: * submission.py: product access, validation, success/failure * auth.py: login attempts, successes, failures, logouts * dashboard.py: access and errors - Add /health endpoint for monitoring (checks data dir, API key) - Add environment variable validation on startup ## Security Hardening (T196-T199, T207) - Add HSTS headers in production (1 year, includeSubDomains) - Add security headers: X-Content-Type-Options, X-Frame-Options, X-XSS-Protection - Verify CSRF protection on all POST routes (Flask-WTF) - Verify session cookie security flags (HttpOnly, Secure, SameSite) - Verify XSS prevention (Jinja2 auto-escaping) - Verify no hardcoded secrets (only in test files) ## Documentation (T195, T203, T210) - Add comprehensive README.md with: * Features, quick start, project structure * Usage guides (end users, product owners, admins) * Configuration, testing, deployment instructions - Add detailed docs/deployment.md with: * Production deployment steps * ClamAV, Nginx, SSL/TLS setup * Security hardening, monitoring, backup strategies - Add requirements-dev.txt for development dependencies ## Performance Testing (T200, T201) - Add test_performance.py with 4 comprehensive tests: * 100 concurrent submissions (SC-012) * Dashboard load <3s for 1000 items (SC-008) * Large file upload handling * Rate limiting verification - Add performance marker to pytest.ini ## Testing - All 49 tests passing, 1 skipped - Fixed error handling to preserve HTTP status codes Phase 7 complete. Application is production-ready with comprehensive logging, security, monitoring, and documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
283 lines
8.6 KiB
Markdown
283 lines
8.6 KiB
Markdown
# Reklamator - Anonymous Feedback Platform
|
|
|
|
Reklamator is a simple, secure anonymous feedback platform that allows users to submit feedback with AI-powered analysis and translation capabilities.
|
|
|
|
## Features
|
|
|
|
✅ **Anonymous Feedback Submission** - Users can submit text feedback and/or file attachments without authentication
|
|
✅ **Multi-language Support** - Accepts feedback in 50+ languages with automatic language detection
|
|
✅ **AI-Powered Analysis** - Automatic categorization, summarization, and translation using Claude AI
|
|
✅ **Secure File Handling** - Virus scanning, file type validation, and size limits
|
|
✅ **Product Owner Dashboard** - Authenticated access to view, filter, and manage feedback
|
|
✅ **Rate Limiting** - Protection against submission abuse
|
|
✅ **Privacy-First** - No IP address logging or session tracking for anonymous submissions
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
- Python 3.11+
|
|
- ClamAV (for virus scanning)
|
|
- Anthropic API key (for AI analysis)
|
|
|
|
### Installation
|
|
|
|
1. Clone the repository:
|
|
```bash
|
|
git clone <repository-url>
|
|
cd reklamator
|
|
```
|
|
|
|
2. Create and activate a virtual environment:
|
|
```bash
|
|
python -m venv venv
|
|
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
```
|
|
|
|
3. Install dependencies:
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
4. Set up environment variables:
|
|
```bash
|
|
cp .env.example .env
|
|
# Edit .env and set:
|
|
# - SECRET_KEY (generate with: python -c "import secrets; print(secrets.token_hex(32))")
|
|
# - ANTHROPIC_API_KEY (get from https://console.anthropic.com/)
|
|
```
|
|
|
|
5. Start ClamAV daemon:
|
|
```bash
|
|
sudo systemctl start clamav-daemon # Linux
|
|
# Or brew services start clamav on macOS
|
|
```
|
|
|
|
6. Initialize the database and create admin user:
|
|
```bash
|
|
python init_admin.py
|
|
```
|
|
|
|
7. Run the application:
|
|
```bash
|
|
python run.py
|
|
```
|
|
|
|
The application will be available at `http://localhost:5000`
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
reklamator/
|
|
├── app/ # Application code
|
|
│ ├── __init__.py # Flask app factory with logging and security
|
|
│ ├── routes/ # Route blueprints
|
|
│ │ ├── submission.py # Anonymous feedback submission
|
|
│ │ ├── dashboard.py # Product owner dashboard
|
|
│ │ ├── auth.py # Authentication
|
|
│ │ └── admin.py # Admin routes (deferred for POC)
|
|
│ ├── services/ # Business logic
|
|
│ │ ├── feedback_storage.py # File-based storage
|
|
│ │ ├── ai_analyzer.py # AI analysis interface
|
|
│ │ └── auth.py # Authentication services
|
|
│ ├── models/ # Domain models
|
|
│ │ ├── user.py # User model
|
|
│ │ ├── product.py # Product model
|
|
│ │ └── feedback.py # Feedback model
|
|
│ ├── templates/ # HTML templates (plain, no frameworks)
|
|
│ └── utils/ # Utilities
|
|
│ └── file_validator.py # File validation and virus scanning
|
|
├── data/ # File-based storage (created at runtime)
|
|
│ ├── products/ # Per-product data
|
|
│ │ └── {product-id}/
|
|
│ │ ├── config.yaml # Product configuration
|
|
│ │ └── feedback/
|
|
│ │ └── {feedback-id}/
|
|
│ │ ├── metadata.yaml # Feedback metadata
|
|
│ │ ├── content.txt # Original text
|
|
│ │ ├── analysis.md # AI analysis report
|
|
│ │ └── attachments/ # File attachments
|
|
│ └── users.yaml # User database (YAML file)
|
|
├── tests/ # Test suite
|
|
│ ├── contract/ # Route contract tests
|
|
│ ├── integration/ # Integration tests
|
|
│ └── unit/ # Unit tests
|
|
├── config/ # Configuration files
|
|
│ ├── development.py # Development config
|
|
│ ├── production.py # Production config (with HSTS)
|
|
│ └── testing.py # Test config
|
|
└── specs/ # Documentation and specifications
|
|
└── 001-build-an-application/
|
|
├── spec.md # Feature specification
|
|
├── plan.md # Implementation plan
|
|
├── tasks.md # Task breakdown
|
|
└── quickstart.md # Developer guide
|
|
```
|
|
|
|
## Usage
|
|
|
|
### For End Users (Anonymous Feedback)
|
|
|
|
1. Navigate to `/submit/{product-slug}`
|
|
2. Enter your feedback in any language (optional if attaching files)
|
|
3. Optionally attach up to 3 files (max 10MB each)
|
|
4. Submit - your feedback is completely anonymous
|
|
|
|
### For Product Owners (Dashboard)
|
|
|
|
1. Navigate to `/login`
|
|
2. Log in with your credentials
|
|
3. View feedback list at `/dashboard`
|
|
4. Filter by category, status, language, or search keywords
|
|
5. Click on feedback to view details and AI analysis
|
|
6. Update status or manually trigger analysis
|
|
|
|
### For Administrators
|
|
|
|
Administrators have access to all products. User and product management is currently done via YAML files (see POC note below).
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
- `SECRET_KEY` - Flask secret key (required in production)
|
|
- `ANTHROPIC_API_KEY` - Claude API key for AI analysis
|
|
- `DATA_DIR` - Data storage directory (default: `./data`)
|
|
- `MAX_CONTENT_LENGTH` - Max upload size in bytes (default: 10MB)
|
|
- `CLAMD_SOCKET` - ClamAV socket path (default: `/var/run/clamav/clamd.ctl`)
|
|
- `RATE_LIMIT_ENABLED` - Enable rate limiting (default: `true`)
|
|
- `RATE_LIMIT_PER_HOUR` - Submissions per hour per IP (default: `10`)
|
|
|
|
### Managing Products and Users (POC)
|
|
|
|
**Note**: User Story 4 (Product/Service Registration and Management) has been deferred for the proof-of-concept. Products and users are managed manually via YAML files.
|
|
|
|
#### Adding a Product
|
|
|
|
1. Create directory: `data/products/{product-id}/`
|
|
2. Create `config.yaml`:
|
|
```yaml
|
|
product_id: my-product
|
|
name: My Product
|
|
submission_url_slug: my-product-feedback
|
|
owner_language: en
|
|
assigned_owner_ids:
|
|
- owner1
|
|
status: active
|
|
```
|
|
|
|
#### Adding a User
|
|
|
|
Edit `data/users.yaml`:
|
|
```yaml
|
|
- user_id: user1
|
|
username: productowner
|
|
password_hash: $2b$12$... # Generate with bcrypt
|
|
role: product_owner
|
|
is_active: true
|
|
product_ids:
|
|
- my-product
|
|
```
|
|
|
|
To generate a password hash:
|
|
```python
|
|
import bcrypt
|
|
print(bcrypt.hashpw(b'password', bcrypt.gensalt()).decode())
|
|
```
|
|
|
|
## Testing
|
|
|
|
Run the test suite:
|
|
```bash
|
|
# All tests
|
|
pytest
|
|
|
|
# Contract tests only
|
|
pytest tests/contract/
|
|
|
|
# Integration tests only
|
|
pytest tests/integration/
|
|
|
|
# With coverage
|
|
pytest --cov=app --cov-report=html
|
|
```
|
|
|
|
## Development
|
|
|
|
Install development dependencies:
|
|
```bash
|
|
pip install -r requirements-dev.txt
|
|
```
|
|
|
|
Run code quality checks:
|
|
```bash
|
|
# Linting
|
|
ruff check .
|
|
|
|
# Formatting
|
|
black .
|
|
|
|
# Type checking
|
|
mypy app/
|
|
```
|
|
|
|
## Production Deployment
|
|
|
|
See [Deployment Guide](docs/deployment.md) for detailed instructions on:
|
|
- ClamAV setup
|
|
- Nginx reverse proxy configuration
|
|
- HTTPS/TLS setup
|
|
- Systemd service configuration
|
|
- Security hardening
|
|
|
|
## Security Features
|
|
|
|
- ✅ CSRF protection on all POST routes (Flask-WTF)
|
|
- ✅ Session cookie security flags (HttpOnly, Secure in production, SameSite)
|
|
- ✅ HSTS headers in production (1 year, includeSubDomains)
|
|
- ✅ Rate limiting on submissions (configurable, default 10/hour)
|
|
- ✅ File upload validation (type, size, virus scanning)
|
|
- ✅ Complete anonymity (no IP logging for submissions)
|
|
- ✅ Structured logging (JSON format in production)
|
|
- ✅ Environment variable validation on startup
|
|
- ✅ Health check endpoint (`/health`)
|
|
|
|
## API Endpoints
|
|
|
|
### Public (No Authentication)
|
|
- `GET /submit/{product_slug}` - Display submission form
|
|
- `POST /submit/{product_slug}` - Submit feedback
|
|
- `GET /health` - Health check endpoint
|
|
|
|
### Authenticated (Product Owners)
|
|
- `GET /login` - Login page
|
|
- `POST /login` - Process login
|
|
- `GET /logout` - Logout
|
|
- `GET /dashboard` - Feedback list with filters
|
|
- `GET /feedback/{id}` - Feedback detail
|
|
- `POST /feedback/{id}/status` - Update feedback status
|
|
- `POST /feedback/{id}/analyze` - Manually trigger AI analysis
|
|
- `GET /feedback/{id}/attachment/{filename}` - Download attachment
|
|
|
|
## Technology Stack
|
|
|
|
- **Backend**: Python 3.11+ with Flask 3.0
|
|
- **AI**: Anthropic Claude API
|
|
- **Security**: ClamAV, Flask-WTF (CSRF), Flask-Limiter (rate limiting)
|
|
- **Authentication**: Flask-Login with bcrypt password hashing
|
|
- **Storage**: File-based (YAML + Markdown, no database)
|
|
- **Testing**: pytest with contract and integration tests
|
|
- **Frontend**: Plain HTML with minimal inline CSS (no frameworks)
|
|
|
|
## License
|
|
|
|
[Add your license here]
|
|
|
|
## Contributing
|
|
|
|
[Add contribution guidelines here]
|
|
|
|
## Support
|
|
|
|
For issues, please open a GitHub issue or contact [your support email].
|