Add waitress + caddy deployment

This commit is contained in:
2026-03-30 22:46:04 +02:00
parent f9d6662467
commit 39fb2edd71
10 changed files with 402 additions and 17 deletions

123
docs/DEPLOYMENT.md Normal file
View File

@@ -0,0 +1,123 @@
# HXBooks Docker Deployment
This directory contains Docker Compose configuration for deploying HXBooks with Caddy as a reverse proxy.
## Architecture
- **App Container**: Runs the Flask application on port 5000
- **Caddy Container**: Reverse proxy with automatic HTTPS, serves static files directly
- **Database Initialization**: Automatic on first startup (creates SQLite database and runs migrations)
- **Volumes**:
- `media`: Book cover images (shared between app and Caddy)
- `static`: CSS/JS files (copied from app to volume on startup, served by Caddy)
- `instance`: Application configuration and SQLite database
- `caddy_data`: TLS certificates
- `caddy_config`: Caddy configuration cache
## Quick Start
1. **Development (localhost)**:
```bash
docker-compose up -d
```
Access the app at http://localhost
2. **Production with your domain**:
- Edit `Caddyfile` and replace `localhost` with your domain
- Run: `docker-compose up -d`
- Caddy will automatically obtain TLS certificates
## Configuration
### Environment Variables
Set these in your `docker-compose.yml` or create a `.env` file:
```bash
# Flask configuration
FLASK_ENV=production
SECRET_KEY=your-secret-key-here
# Optional: Google Books API key
GOOGLE_BOOKS_API_KEY=your-api-key
```
### Custom Configuration
Create `instance/config.py` for local overrides:
```python
SECRET_KEY = "your-production-secret-key"
GOOGLE_BOOKS_API_KEY = "your-api-key"
# Add other Flask config as needed
```
## Commands
```bash
# Start services
docker-compose up -d
# View logs
docker-compose logs -f app
docker-compose logs -f caddy
# Stop services
docker-compose down
# Rebuild and restart
docker-compose up --build -d
# Remove everything including volumes (⚠️ destroys data)
docker-compose down -v
```
## File Serving Strategy
- **Static files** (CSS/JS): Copied from app container to shared volume on startup, served directly by Caddy
- **Media files** (book covers): Stored in shared volume, served directly by Caddy
- **Application routes**: Proxied to Flask app
This setup provides optimal performance by having Caddy serve static assets while the Flask app handles dynamic content.
## Database Initialization
The application handles database setup automatically on first startup:
1. **Fresh Install**: Creates SQLite database and initializes tables using `hxbooks db init`
2. **Existing Database**: Runs Flask-Migrate migrations with `flask db upgrade`
3. **Database Location**: `/app/instance/hxbooks.sqlite` (persisted in `instance` volume)
**Manual Database Operations** (if needed):
```bash
# Connect to running container
docker-compose exec app sh
# Initialize database manually
hxbooks db init
# Create new migration
flask db migrate -m "description"
# Apply migrations
flask db upgrade
```
## Production Notes
1. **Database**: Currently uses SQLite with volume persistence. For high-traffic sites, consider PostgreSQL.
2. **Backups**: The important data is in the `instance` and `media` volumes:
```bash
# Backup
docker run --rm -v hxbooks_instance:/source -v $(pwd):/backup alpine tar czf /backup/instance-backup.tar.gz -C /source .
docker run --rm -v hxbooks_media:/source -v $(pwd):/backup alpine tar czf /backup/media-backup.tar.gz -C /source .
```
3. **Updates**: To update the application:
```bash
docker-compose pull
docker-compose up --build -d
```
4. **Monitoring**: Consider adding health check endpoints and monitoring services to the stack.