367 lines
8.5 KiB
Markdown
367 lines
8.5 KiB
Markdown
# Das File Storage Web Application
|
|
|
|
A production-ready file storage service built with FastAPI, PostgreSQL, and session-based authentication.
|
|
|
|
## Features
|
|
|
|
- **Web Interface**: Modern, responsive GUI for users and admins
|
|
- **User Authentication**: Session-based auth for web, HTTP Basic Auth and API Key for REST API
|
|
- **Role-Based Access**: Admin and regular user roles
|
|
- **File Management**: Upload, download, delete files via web UI or API
|
|
- **Secure Sharing**: Generate secure share links without exposing usernames or filenames
|
|
- **Admin Panel**: Full user management interface (create, delete, block users)
|
|
- **Settings Page**: Change password, manage API keys
|
|
- **Password Security**: PBKDF2-SHA256 password hashing
|
|
- **Database**: PostgreSQL for all metadata storage
|
|
|
|
## Quick Start
|
|
|
|
### Using Docker Compose (Recommended)
|
|
|
|
1. Clone the repository
|
|
2. Update database credentials in `docker-compose.yml`
|
|
3. Run:
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
The application will be available at `http://localhost:8000` by default
|
|
|
|
### Project Structure
|
|
|
|
```
|
|
project/
|
|
├── main.py # Main application file
|
|
├── requirements.txt # Python dependencies
|
|
├── docker-compose.yml # Docker configuration
|
|
├── Dockerfile # Container image
|
|
├── .env # Environment variables
|
|
├── templates/ # HTML templates
|
|
│ ├── base.html # Base template
|
|
│ ├── login.html # Login page
|
|
│ ├── user_files.html # User dashboard
|
|
│ ├── settings.html # Settings page
|
|
│ └── admin.html # Admin panel
|
|
└── uploads/ # File storage directory
|
|
```
|
|
|
|
### Manual Installation
|
|
|
|
1. Install PostgreSQL and create a database:
|
|
```sql
|
|
CREATE DATABASE filestore;
|
|
```
|
|
|
|
2. Install Python dependencies:
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
3. Create `.env` file:
|
|
```bash
|
|
cp .env.example .env
|
|
# Edit .env with your database credentials
|
|
```
|
|
|
|
4. Update `configs/server_config.yaml` file with your own server's configuration (including `secrets.yaml` if needed)
|
|
|
|
5. Create templates directory and add HTML files:
|
|
```bash
|
|
mkdir templates
|
|
# Copy all template files (base.html, login.html, user_files.html, settings.html, admin.html)
|
|
```
|
|
|
|
6. Run the application:
|
|
```bash
|
|
python main.py
|
|
```
|
|
|
|
Or with uvicorn:
|
|
```bash
|
|
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
|
|
```
|
|
|
|
## Default Admin Account
|
|
|
|
On first startup, a default admin account is created:
|
|
- **Username**: `admin`
|
|
- **Password**: `admin123`
|
|
- **⚠️ Change this password immediately in production!**
|
|
|
|
The admin API key will be printed in the console on first startup.
|
|
|
|
## Web Interface
|
|
|
|
### User Interface
|
|
|
|
1. **Login Page** (`/login`)
|
|
- Clean, modern login interface
|
|
- Username and password authentication
|
|
|
|
2. **Dashboard** (`/dashboard`)
|
|
- View all your uploaded files
|
|
- Upload new files with drag-and-drop
|
|
- Download files
|
|
- Generate and copy share links
|
|
- Delete files
|
|
- File size and upload date information
|
|
|
|
3. **Settings** (`/settings`)
|
|
- Change your password
|
|
- View and copy your API key
|
|
- Regenerate API key
|
|
- View account information
|
|
|
|
### Admin Interface
|
|
|
|
4. **Admin Panel** (`/admin`)
|
|
- Dashboard statistics (total users, active/blocked, total files)
|
|
- User management table
|
|
- Create new users
|
|
- Block/unblock users
|
|
- Delete users
|
|
- View file counts per user
|
|
|
|
### Navigation
|
|
|
|
All pages have a navigation bar with:
|
|
- User badge showing username and role
|
|
- Quick access to dashboard, settings, and admin panel (if admin)
|
|
- Logout button
|
|
|
|
## API Documentation
|
|
|
|
Once running, visit:
|
|
- Interactive API docs: `http://localhost:8000/docs`
|
|
- Alternative docs: `http://localhost:8000/redoc`
|
|
|
|
## API Endpoints
|
|
|
|
### Authentication
|
|
|
|
**HTTP Basic Auth**: Use username and password in the Authorization header
|
|
```bash
|
|
curl -u username:password http://localhost:8000/api/files
|
|
```
|
|
|
|
**API Key Auth**: Use X-API-Key header
|
|
```bash
|
|
curl -H "X-API-Key: your-api-key" http://localhost:8000/api/files
|
|
```
|
|
|
|
### User Management (Admin Only)
|
|
|
|
#### Create User
|
|
```bash
|
|
POST /api/users
|
|
Authorization: Basic admin:admin123
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"username": "newuser",
|
|
"password": "securepass123",
|
|
"is_admin": false
|
|
}
|
|
```
|
|
|
|
#### List Users
|
|
```bash
|
|
GET /api/users
|
|
Authorization: Basic admin:admin123
|
|
```
|
|
|
|
#### Delete User
|
|
```bash
|
|
DELETE /api/users/{user_id}
|
|
Authorization: Basic admin:admin123
|
|
```
|
|
|
|
#### Block/Unblock User
|
|
```bash
|
|
PATCH /api/users/{user_id}/block?block=true
|
|
Authorization: Basic admin:admin123
|
|
```
|
|
|
|
#### Get Your API Key
|
|
```bash
|
|
GET /api/users/me/api-key
|
|
Authorization: Basic username:password
|
|
```
|
|
|
|
#### Regenerate API Key
|
|
```bash
|
|
POST /api/users/me/api-key/regenerate
|
|
Authorization: Basic username:password
|
|
```
|
|
|
|
### File Management
|
|
|
|
#### Upload File
|
|
```bash
|
|
POST /api/files/upload
|
|
Authorization: Basic username:password
|
|
Content-Type: multipart/form-data
|
|
|
|
file=@/path/to/file.pdf
|
|
```
|
|
|
|
With API Key:
|
|
```bash
|
|
curl -X POST \
|
|
-H "X-API-Key: your-api-key" \
|
|
-F "file=@document.pdf" \
|
|
http://localhost:8000/api/files/upload
|
|
```
|
|
|
|
#### List Your Files
|
|
```bash
|
|
GET /api/files
|
|
Authorization: Basic username:password
|
|
```
|
|
|
|
#### Download File
|
|
```bash
|
|
GET /api/files/{file_id}/download
|
|
Authorization: Basic username:password
|
|
```
|
|
|
|
#### Delete File
|
|
```bash
|
|
DELETE /api/files/{file_id}
|
|
Authorization: Basic username:password
|
|
```
|
|
|
|
### Public File Sharing
|
|
|
|
#### Download Shared File (No Auth Required)
|
|
```bash
|
|
GET /share/{share_token}
|
|
```
|
|
|
|
Example: `http://localhost:8000/share/abc123xyz...`
|
|
|
|
## Database Schema
|
|
|
|
### Users Table
|
|
- `id`: Primary key
|
|
- `username`: Unique username
|
|
- `password_hash`: PBKDF2-SHA256 hashed password
|
|
- `is_admin`: Admin role flag
|
|
- `is_blocked`: Block status
|
|
- `api_key`: Unique API key for REST authentication
|
|
- `created_at`: Account creation timestamp
|
|
|
|
### Files Table
|
|
- `id`: Primary key
|
|
- `filename`: Original filename
|
|
- `stored_filename`: Unique stored filename
|
|
- `file_size`: File size in bytes
|
|
- `content_type`: MIME type
|
|
- `share_token`: Secure token for public sharing
|
|
- `user_id`: Foreign key to users
|
|
- `uploaded_at`: Upload timestamp
|
|
|
|
## Security Features
|
|
|
|
1. **Password Hashing**: PBKDF2-SHA256 with 100,000 iterations
|
|
2. **Secure Tokens**: Cryptographically secure random tokens for API keys and share links
|
|
3. **User Isolation**: Users can only access their own files
|
|
4. **Admin Controls**: Block/unblock users, manage accounts
|
|
5. **Share Links**: No exposure of usernames or original filenames
|
|
|
|
## Production Deployment
|
|
|
|
### Environment Variables
|
|
|
|
```bash
|
|
DATABASE_URL=postgresql://user:pass@host:port/dbname
|
|
UPLOAD_DIR=/var/app/uploads
|
|
```
|
|
|
|
### Security Checklist
|
|
|
|
- [ ] Change default admin password
|
|
- [ ] Use strong database credentials
|
|
- [ ] Enable HTTPS/TLS
|
|
- [ ] Set up firewall rules
|
|
- [ ] Configure backup strategy
|
|
- [ ] Set up monitoring and logging
|
|
- [ ] Limit file upload sizes
|
|
- [ ] Implement rate limiting
|
|
- [ ] Regular security updates
|
|
|
|
### Nginx Configuration Example
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name yourdomain.com;
|
|
|
|
client_max_body_size 100M;
|
|
|
|
location / {
|
|
proxy_pass http://localhost:8000;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
}
|
|
```
|
|
|
|
### PostgreSQL Optimization
|
|
|
|
```sql
|
|
-- Create indexes for better performance
|
|
CREATE INDEX idx_files_user_id ON files(user_id);
|
|
CREATE INDEX idx_files_share_token ON files(share_token);
|
|
CREATE INDEX idx_users_username ON users(username);
|
|
CREATE INDEX idx_users_api_key ON users(api_key);
|
|
```
|
|
|
|
## Testing
|
|
|
|
### Create a Test User
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/users \
|
|
-u admin:admin123 \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"username": "testuser", "password": "testpass123"}'
|
|
```
|
|
|
|
### Upload a Test File
|
|
```bash
|
|
echo "Hello World" > test.txt
|
|
curl -X POST http://localhost:8000/api/files/upload \
|
|
-u testuser:testpass123 \
|
|
-F "file=@test.txt"
|
|
```
|
|
|
|
### List Files
|
|
```bash
|
|
curl http://localhost:8000/api/files \
|
|
-u testuser:testpass123
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Database Connection Issues
|
|
- Verify PostgreSQL is running
|
|
- Check DATABASE_URL is correct
|
|
- Ensure database exists and user has permissions
|
|
|
|
### File Upload Issues
|
|
- Check UPLOAD_DIR exists and has write permissions
|
|
- Verify disk space is available
|
|
- Check file size limits
|
|
|
|
### Authentication Issues
|
|
- Verify username/password are correct
|
|
- Check if user is blocked
|
|
- Ensure API key is valid and not regenerated
|
|
|
|
## Support
|
|
|
|
For issues and questions, please open an issue on the repository.
|
|
|
|
###### _Made by -=:dAs:=-_ |