411 lines
11 KiB
Markdown
411 lines
11 KiB
Markdown
# Feuerwehr Dashboard
|
|
|
|
A modern, secure web application for managing fire department operations with integrated Authentik SSO authentication.
|
|
|
|
## Overview
|
|
|
|
The Feuerwehr Dashboard is a full-stack web application designed specifically for fire departments (Feuerwehr) to manage operations, personnel, and administrative tasks. Built with modern technologies and security best practices, it provides a robust platform for fire service management.
|
|
|
|
## Features
|
|
|
|
### Authentication & Security
|
|
- OAuth 2.0 / OpenID Connect integration with Authentik
|
|
- Secure JWT-based session management
|
|
- Role-based access control (RBAC)
|
|
- Automatic token refresh
|
|
- Rate limiting and security headers (Helmet.js)
|
|
- CORS protection
|
|
|
|
### Dashboard & User Management
|
|
- Modern, responsive Material-UI interface
|
|
- Real-time user profile management
|
|
- Secure user session handling
|
|
- Multi-device support
|
|
- Dark mode ready
|
|
|
|
### Service Management
|
|
- Extensible service architecture
|
|
- Database-backed operations
|
|
- RESTful API design
|
|
- Health monitoring endpoints
|
|
|
|
## Tech Stack
|
|
|
|
### Frontend
|
|
- **React 18** - Modern UI library
|
|
- **TypeScript** - Type-safe development
|
|
- **Material-UI (MUI)** - Component library
|
|
- **React Router** - Client-side routing
|
|
- **Axios** - HTTP client
|
|
- **Vite** - Build tool and dev server
|
|
- **Nginx** - Production web server
|
|
|
|
### Backend
|
|
- **Node.js 18+** - Runtime environment
|
|
- **Express 5** - Web framework
|
|
- **TypeScript** - Type-safe development
|
|
- **PostgreSQL 16** - Database
|
|
- **jsonwebtoken** - JWT handling
|
|
- **Helmet** - Security middleware
|
|
- **Winston** - Logging
|
|
- **Zod** - Schema validation
|
|
|
|
### Infrastructure
|
|
- **Docker & Docker Compose** - Containerization
|
|
- **PostgreSQL 16 Alpine** - Production database
|
|
- **Nginx Alpine** - Frontend serving
|
|
- **Health checks** - Service monitoring
|
|
|
|
## Prerequisites
|
|
|
|
- **Docker** 20.10+ and **Docker Compose** 2.0+
|
|
- **Authentik** instance (self-hosted or cloud)
|
|
- **Node.js 18+** (for local development)
|
|
- **Git**
|
|
|
|
## Quick Start
|
|
|
|
Get the dashboard running in 3 simple steps:
|
|
|
|
### 1. Clone and Configure
|
|
|
|
```bash
|
|
git clone <your-repository-url>
|
|
cd feuerwehr_dashboard
|
|
cp .env.example .env
|
|
```
|
|
|
|
Edit `.env` with your configuration (see [Environment Variables](#environment-variables) section).
|
|
|
|
### 2. Configure Authentik
|
|
|
|
Follow the [Authentik Setup Guide](AUTHENTIK_SETUP.md) to create and configure your OAuth application.
|
|
|
|
### 3. Deploy
|
|
|
|
```bash
|
|
make prod
|
|
# or
|
|
./deploy.sh production
|
|
```
|
|
|
|
The dashboard will be available at `http://localhost` (or your configured domain).
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
feuerwehr_dashboard/
|
|
├── backend/ # Node.js/Express backend
|
|
│ ├── src/
|
|
│ │ ├── config/ # Configuration files
|
|
│ │ ├── controllers/ # Request handlers
|
|
│ │ ├── database/ # Database setup and migrations
|
|
│ │ ├── middleware/ # Express middleware
|
|
│ │ ├── models/ # Data models
|
|
│ │ ├── routes/ # API routes
|
|
│ │ ├── services/ # Business logic
|
|
│ │ ├── types/ # TypeScript types
|
|
│ │ ├── utils/ # Utility functions
|
|
│ │ ├── app.ts # Express app setup
|
|
│ │ └── server.ts # Server entry point
|
|
│ ├── Dockerfile # Backend container
|
|
│ └── package.json
|
|
├── frontend/ # React/TypeScript frontend
|
|
│ ├── src/
|
|
│ │ ├── components/ # Reusable components
|
|
│ │ ├── contexts/ # React contexts
|
|
│ │ ├── pages/ # Page components
|
|
│ │ ├── services/ # API services
|
|
│ │ ├── theme/ # MUI theme
|
|
│ │ ├── types/ # TypeScript types
|
|
│ │ ├── utils/ # Utility functions
|
|
│ │ ├── App.tsx # Main app component
|
|
│ │ └── main.tsx # Entry point
|
|
│ ├── Dockerfile # Frontend container
|
|
│ ├── nginx.conf # Nginx configuration
|
|
│ └── package.json
|
|
├── docker-compose.yml # Production deployment
|
|
├── docker-compose.dev.yml # Development database
|
|
├── .env.example # Environment template
|
|
├── deploy.sh # Deployment script
|
|
├── Makefile # Make commands
|
|
├── README.md # This file
|
|
├── DEPLOYMENT.md # Deployment guide
|
|
├── DEVELOPMENT.md # Developer guide
|
|
├── AUTHENTIK_SETUP.md # Authentik configuration
|
|
├── API_DOCUMENTATION.md # API reference
|
|
├── ARCHITECTURE.md # System architecture
|
|
├── SECURITY.md # Security guidelines
|
|
├── CONTRIBUTING.md # Contribution guide
|
|
└── CHANGELOG.md # Version history
|
|
```
|
|
|
|
## Development Setup
|
|
|
|
For local development without Docker, follow these steps:
|
|
|
|
### 1. Start Development Database
|
|
|
|
```bash
|
|
make dev
|
|
# or
|
|
./deploy.sh local
|
|
```
|
|
|
|
This starts a PostgreSQL container with development credentials.
|
|
|
|
### 2. Install Dependencies
|
|
|
|
```bash
|
|
make install
|
|
# or manually:
|
|
cd backend && npm install
|
|
cd ../frontend && npm install
|
|
```
|
|
|
|
### 3. Configure Environment
|
|
|
|
Backend `.env` (in `backend/.env`):
|
|
```bash
|
|
DATABASE_URL=postgresql://dev_user:dev_password@localhost:5432/feuerwehr_dev
|
|
JWT_SECRET=your_development_secret
|
|
NODE_ENV=development
|
|
PORT=3000
|
|
```
|
|
|
|
Frontend `.env` (in `frontend/.env`):
|
|
```bash
|
|
VITE_API_URL=http://localhost:3000
|
|
```
|
|
|
|
### 4. Run Services
|
|
|
|
Terminal 1 - Backend:
|
|
```bash
|
|
cd backend
|
|
npm run dev
|
|
```
|
|
|
|
Terminal 2 - Frontend:
|
|
```bash
|
|
cd frontend
|
|
npm run dev
|
|
```
|
|
|
|
Access the app at `http://localhost:5173` (Vite dev server).
|
|
|
|
For more details, see [DEVELOPMENT.md](DEVELOPMENT.md).
|
|
|
|
## Production Deployment
|
|
|
|
For complete production deployment instructions, see [DEPLOYMENT.md](DEPLOYMENT.md).
|
|
|
|
### Quick Production Setup
|
|
|
|
1. **Configure environment variables** in `.env`:
|
|
- Set strong `POSTGRES_PASSWORD`
|
|
- Generate secure `JWT_SECRET` (use `openssl rand -base64 32`)
|
|
- Configure `CORS_ORIGIN` to match your frontend URL
|
|
- Set Authentik credentials
|
|
|
|
2. **Deploy all services**:
|
|
```bash
|
|
make prod
|
|
```
|
|
|
|
3. **Verify deployment**:
|
|
```bash
|
|
docker-compose ps
|
|
make logs-prod
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
### Required Variables
|
|
|
|
| Variable | Description | Example |
|
|
|----------|-------------|---------|
|
|
| `POSTGRES_PASSWORD` | Database password (production) | `SecureP@ssw0rd!` |
|
|
| `JWT_SECRET` | JWT signing secret | `openssl rand -base64 32` |
|
|
| `AUTHENTIK_CLIENT_ID` | OAuth client ID from Authentik | `abc123...` |
|
|
| `AUTHENTIK_CLIENT_SECRET` | OAuth client secret | `xyz789...` |
|
|
| `AUTHENTIK_ISSUER` | Authentik issuer URL | `https://auth.example.com/application/o/feuerwehr/` |
|
|
|
|
### Optional Variables
|
|
|
|
| Variable | Description | Default |
|
|
|----------|-------------|---------|
|
|
| `POSTGRES_DB` | Database name | `feuerwehr_prod` |
|
|
| `POSTGRES_USER` | Database user | `prod_user` |
|
|
| `POSTGRES_PORT` | Database port | `5432` |
|
|
| `BACKEND_PORT` | Backend API port | `3000` |
|
|
| `FRONTEND_PORT` | Frontend port | `80` |
|
|
| `NODE_ENV` | Node environment | `production` |
|
|
| `CORS_ORIGIN` | Allowed frontend origin | `http://localhost:80` |
|
|
| `VITE_API_URL` | Frontend API URL | `http://localhost:3000` |
|
|
|
|
For complete documentation, see [.env.example](.env.example).
|
|
|
|
## Available Commands
|
|
|
|
### Using Make (Recommended)
|
|
|
|
```bash
|
|
# Development
|
|
make dev # Start local development database
|
|
make logs-dev # Show development logs
|
|
make rebuild-dev # Rebuild development services
|
|
|
|
# Production
|
|
make prod # Deploy production environment
|
|
make logs-prod # Show production logs
|
|
make rebuild # Rebuild production services
|
|
|
|
# General
|
|
make stop # Stop all services
|
|
make clean # Remove all containers, volumes, and images
|
|
make install # Install all dependencies
|
|
make test # Run tests
|
|
make help # Show all available commands
|
|
```
|
|
|
|
### Using Deploy Script
|
|
|
|
```bash
|
|
./deploy.sh production # Deploy production
|
|
./deploy.sh local # Start local dev database
|
|
./deploy.sh stop # Stop all services
|
|
./deploy.sh logs # Show production logs
|
|
./deploy.sh rebuild # Rebuild services
|
|
./deploy.sh clean # Clean up everything
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Database Connection Failed
|
|
|
|
**Symptoms**: Backend logs show database connection errors
|
|
|
|
**Solutions**:
|
|
```bash
|
|
# Check if database is running
|
|
docker-compose ps
|
|
|
|
# View database logs
|
|
make logs-dev # or logs-prod
|
|
|
|
# Restart database
|
|
docker-compose restart postgres
|
|
|
|
# Verify credentials in .env match docker-compose.yml
|
|
```
|
|
|
|
### Authentication Not Working
|
|
|
|
**Symptoms**: Login redirects fail or return errors
|
|
|
|
**Solutions**:
|
|
1. Verify Authentik configuration (see [AUTHENTIK_SETUP.md](AUTHENTIK_SETUP.md))
|
|
2. Check redirect URIs match exactly
|
|
3. Verify `AUTHENTIK_CLIENT_ID` and `AUTHENTIK_CLIENT_SECRET` in `.env`
|
|
4. Check browser console for CORS errors
|
|
5. Ensure `CORS_ORIGIN` matches your frontend URL
|
|
|
|
### Port Already in Use
|
|
|
|
**Symptoms**: Docker fails to start with "port already allocated"
|
|
|
|
**Solutions**:
|
|
```bash
|
|
# Find what's using the port
|
|
lsof -i :3000 # or :80, :5432
|
|
|
|
# Change ports in .env
|
|
BACKEND_PORT=3001
|
|
FRONTEND_PORT=8080
|
|
POSTGRES_PORT=5433
|
|
```
|
|
|
|
### Frontend Can't Reach Backend
|
|
|
|
**Symptoms**: API calls fail with network errors
|
|
|
|
**Solutions**:
|
|
1. Verify `VITE_API_URL` in `.env` matches backend URL
|
|
2. Check `CORS_ORIGIN` in backend allows frontend URL
|
|
3. Ensure backend is running: `curl http://localhost:3000/health`
|
|
4. Check network connectivity between containers
|
|
|
|
### Complete Reset
|
|
|
|
If all else fails:
|
|
```bash
|
|
make clean # Removes everything
|
|
make prod # Fresh deployment
|
|
```
|
|
|
|
For more issues, see [DEVELOPMENT.md](DEVELOPMENT.md#common-issues).
|
|
|
|
## API Documentation
|
|
|
|
See [API_DOCUMENTATION.md](API_DOCUMENTATION.md) for complete API reference.
|
|
|
|
### Quick API Overview
|
|
|
|
- `POST /api/auth/callback` - Handle OAuth callback
|
|
- `POST /api/auth/refresh` - Refresh access token
|
|
- `POST /api/auth/logout` - Logout user
|
|
- `GET /api/user/me` - Get current user
|
|
- `GET /health` - Health check endpoint
|
|
|
|
## Security
|
|
|
|
This application implements security best practices:
|
|
|
|
- OAuth 2.0 / OpenID Connect authentication
|
|
- JWT-based stateless sessions
|
|
- HTTP security headers (Helmet.js)
|
|
- CORS protection
|
|
- Rate limiting
|
|
- SQL injection protection (parameterized queries)
|
|
- XSS protection
|
|
- Secure password handling (delegated to Authentik)
|
|
|
|
For security guidelines and reporting vulnerabilities, see [SECURITY.md](SECURITY.md).
|
|
|
|
## Contributing
|
|
|
|
We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for:
|
|
|
|
- Code style guidelines
|
|
- Development workflow
|
|
- Pull request process
|
|
- Issue reporting
|
|
|
|
## Architecture
|
|
|
|
For system architecture, component diagrams, and data flow, see [ARCHITECTURE.md](ARCHITECTURE.md).
|
|
|
|
## Changelog
|
|
|
|
See [CHANGELOG.md](CHANGELOG.md) for version history and release notes.
|
|
|
|
## License
|
|
|
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
|
|
## Support
|
|
|
|
For questions or issues:
|
|
|
|
1. Check [Troubleshooting](#troubleshooting) section
|
|
2. Review relevant documentation files
|
|
3. Search existing issues
|
|
4. Create a new issue with detailed information
|
|
|
|
## Acknowledgments
|
|
|
|
- Built with modern open-source technologies
|
|
- Designed for fire department operations management
|
|
- Inspired by the need for secure, user-friendly emergency services software
|