mirror of
https://github.com/kennethreitz/kjvstudy.org.git
synced 2026-06-20 22:40:57 +00:00
8775346240
Enable preloading of interlinear data at application startup to eliminate first-request delays. Configurable via PRELOAD_INTERLINEAR environment variable. - Add preload_data() function to interlinear_loader.py with logging - Add startup event handler in server.py to trigger preload - Enable PRELOAD_INTERLINEAR=true in fly.toml and docker-compose.yml - Update FLY_DEPLOYMENT.md with cache warming documentation Performance impact: - Startup time: ~7-10 seconds (vs ~5 seconds without preload) - First request: <100ms (vs 2-3 seconds without preload) - Memory usage: ~400-500MB total (139MB for interlinear data) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
166 lines
3.6 KiB
Markdown
166 lines
3.6 KiB
Markdown
# Fly.io Deployment Guide
|
|
|
|
This document describes how to deploy kjvstudy.org to Fly.io.
|
|
|
|
## Prerequisites
|
|
|
|
- [Fly.io CLI](https://fly.io/docs/hands-on/install-flyctl/) installed
|
|
- Fly.io account created
|
|
|
|
## Configuration
|
|
|
|
The app is configured for optimal performance on Fly.io:
|
|
|
|
### Memory & CPU
|
|
- **Memory**: 2GB (to handle 139MB uncompressed interlinear data in memory)
|
|
- **CPUs**: 2 shared CPUs
|
|
- **Auto-scaling**: Machines stop when idle, start automatically on requests
|
|
|
|
### Health Checks
|
|
- **Endpoint**: `/health`
|
|
- **Interval**: Every 15 seconds
|
|
- **Timeout**: 10 seconds
|
|
- **Grace period**: 30 seconds for startup
|
|
|
|
### Data Optimization
|
|
- Interlinear Bible data compressed to 13.5 MB (from 139 MB)
|
|
- **Cache warming on startup** - data preloaded for fast first requests
|
|
- Production logging with error handling
|
|
- Configurable via `PRELOAD_INTERLINEAR` environment variable
|
|
|
|
## Deployment Steps
|
|
|
|
### Initial Setup
|
|
```bash
|
|
# Login to Fly.io
|
|
fly auth login
|
|
|
|
# Deploy the app
|
|
fly deploy
|
|
```
|
|
|
|
### Viewing Logs
|
|
```bash
|
|
# Stream logs
|
|
fly logs
|
|
|
|
# View specific number of log lines
|
|
fly logs -n 100
|
|
```
|
|
|
|
### Monitoring
|
|
```bash
|
|
# Check app status
|
|
fly status
|
|
|
|
# View app info
|
|
fly info
|
|
|
|
# Open the app in browser
|
|
fly open
|
|
```
|
|
|
|
### Scaling
|
|
```bash
|
|
# Scale memory if needed
|
|
fly scale memory 4096
|
|
|
|
# Scale CPUs
|
|
fly scale count 2
|
|
```
|
|
|
|
## Important Files
|
|
|
|
- `fly.toml` - Fly.io configuration
|
|
- `Dockerfile` - Multi-stage build with uv
|
|
- `.dockerignore` - Excludes large uncompressed files
|
|
- `kjvstudy_org/interlinear_data.py.gz` - Compressed interlinear data (13.5 MB)
|
|
- `kjvstudy_org/interlinear_loader.py` - Lazy loader with error handling
|
|
|
|
## Performance Notes
|
|
|
|
### Memory Usage
|
|
- Base app: ~200-300 MB
|
|
- Interlinear data (loaded): ~139 MB
|
|
- Total: ~400-500 MB
|
|
- Allocated: 2 GB (comfortable headroom)
|
|
|
|
### Startup Time
|
|
- Docker build: ~30-60 seconds
|
|
- **With preload enabled** (default):
|
|
- App startup: ~7-10 seconds (loads data on startup)
|
|
- All requests: <100ms (cache is warm)
|
|
- **With preload disabled**:
|
|
- App startup: ~5 seconds
|
|
- First interlinear request: ~2-3 seconds
|
|
- Subsequent requests: <100ms
|
|
|
|
### Auto-Scaling
|
|
- Machines stop after 5 minutes of inactivity
|
|
- First request after sleep: ~5-10 seconds (cold start + data load)
|
|
- Consider keeping 1 machine always running for production:
|
|
```bash
|
|
fly scale count 1 --max-per-region 1
|
|
```
|
|
|
|
## Configuration Options
|
|
|
|
### Disable Preload (if needed)
|
|
If you want faster startup at the cost of slower first interlinear request:
|
|
|
|
1. Edit `fly.toml`:
|
|
```toml
|
|
[env]
|
|
PRELOAD_INTERLINEAR = "false" # Disable cache warming
|
|
```
|
|
|
|
2. Deploy:
|
|
```bash
|
|
fly deploy
|
|
```
|
|
|
|
**When to disable:**
|
|
- Testing/development environments
|
|
- If startup time is critical
|
|
- If interlinear feature is rarely used
|
|
|
|
**When to keep enabled (default):**
|
|
- Production environments
|
|
- When users frequently access interlinear verses
|
|
- When you want consistent fast performance
|
|
|
|
## Troubleshooting
|
|
|
|
### Data Loading Errors
|
|
Check logs for interlinear data loading:
|
|
```bash
|
|
fly logs | grep -i interlinear
|
|
```
|
|
|
|
Should see:
|
|
```
|
|
Loading interlinear data from /app/kjvstudy_org/interlinear_data.py.gz...
|
|
Successfully loaded 31031 verses
|
|
```
|
|
|
|
### Memory Issues
|
|
If OOM errors occur, increase memory:
|
|
```bash
|
|
fly scale memory 4096
|
|
```
|
|
|
|
### SSL/HTTPS
|
|
Fly.io automatically provides SSL certificates. The `force_https = true` setting ensures all HTTP requests redirect to HTTPS.
|
|
|
|
## URLs
|
|
|
|
- Production: https://kjvstudy.fly.dev
|
|
- Health check: https://kjvstudy.fly.dev/health
|
|
- Interlinear Bible: https://kjvstudy.fly.dev/interlinear
|
|
|
|
## Support
|
|
|
|
For Fly.io specific issues, see:
|
|
- [Fly.io Documentation](https://fly.io/docs/)
|
|
- [Fly.io Community](https://community.fly.io/)
|