Files
2026-01-28 11:41:24 -05:00

368 lines
8.3 KiB
Markdown

# ReadMeABook - Docker Deployment Guide
## Quick Start
### Prerequisites
- Docker Engine 20.10+
- Docker Compose V2
- 2GB+ available disk space
- Ports 3000 available on host
### First Time Setup
1. **Clone the repository**
```bash
git clone <your-repo-url>
cd ReadMeABook
```
2. **Create required directories**
```bash
mkdir -p config downloads media
```
3. **Generate secure secrets**
```bash
# Generate NEXTAUTH_SECRET (minimum 32 characters)
openssl rand -base64 32
```
4. **Edit docker-compose.yml**
Update the following environment variables in `docker-compose.yml`:
```yaml
environment:
# REQUIRED: Change these values
DATABASE_URL: postgresql://readmeabook:YOUR_SECURE_PASSWORD@postgres:5432/readmeabook
NEXTAUTH_SECRET: YOUR_GENERATED_SECRET_FROM_STEP_3
# Update if not running on localhost
NEXTAUTH_URL: http://localhost:3000
```
Also update the PostgreSQL password in the `postgres` service:
```yaml
postgres:
environment:
POSTGRES_PASSWORD: YOUR_SECURE_PASSWORD # Must match DATABASE_URL
```
5. **Start the application**
```bash
docker compose up -d
```
6. **View logs**
```bash
# Follow all logs
docker compose logs -f
# Or just the application
docker compose logs -f app
```
7. **Access the application**
Open your browser to:
- **Application**: http://localhost:3000
- **Setup Wizard**: http://localhost:3000/setup
### Initial Configuration
On first launch, visit http://localhost:3000/setup and configure:
1. **Plex Media Server**
- Your Plex server URL
- Authentication token
- Audiobook library selection
2. **Prowlarr**
- Prowlarr server URL
- API key
3. **Download Client**
- qBittorrent or Transmission
- Server URL and credentials
4. **Directory Paths**
- Download directory: `/downloads` (already mounted)
- Media directory: `/media/audiobooks` (already mounted)
## Common Operations
### View Status
```bash
docker compose ps
```
### View Logs
```bash
# All services
docker compose logs -f
# Specific service
docker compose logs -f app
docker compose logs -f postgres
docker compose logs -f redis
```
### Restart Application
```bash
docker compose restart app
```
### Stop Services
```bash
docker compose down
```
### Update Application
```bash
# Pull latest changes
git pull
# Rebuild and restart
docker compose up -d --build
# Migrations run automatically on startup
```
### Clean Restart (Preserves Data)
```bash
docker compose down
docker compose up -d --build
```
### Complete Reset (DELETES ALL DATA)
```bash
docker compose down -v
rm -rf config/*
docker compose up -d
```
## Backup & Restore
### Backup Database
```bash
# Create backup
docker compose exec postgres pg_dump -U readmeabook readmeabook > backup-$(date +%Y%m%d).sql
# Backup volumes
tar -czf backup-volumes-$(date +%Y%m%d).tar.gz config downloads media
```
### Restore Database
```bash
# Restore from backup
docker compose exec -T postgres psql -U readmeabook readmeabook < backup-20240101.sql
# Restore volumes
tar -xzf backup-volumes-20240101.tar.gz
```
## Troubleshooting
### Application Won't Start
```bash
# Check logs
docker compose logs app
# Verify services are healthy
docker compose ps
# Check migrations
docker compose exec app npx prisma migrate status
# Manually run migrations
docker compose exec app npx prisma migrate deploy
```
### Database Connection Errors
```bash
# Test PostgreSQL
docker compose exec postgres pg_isready -U readmeabook
# Check environment variables
docker compose exec app env | grep DATABASE_URL
# Restart PostgreSQL
docker compose restart postgres
```
### Redis Connection Errors
```bash
# Test Redis
docker compose exec redis redis-cli ping
# Should return: PONG
# Restart Redis
docker compose restart redis
```
### Port Already in Use
If port 3000 is already in use, edit `docker-compose.yml`:
```yaml
app:
ports:
- "8080:3000" # Changed from 3000:3000
```
Then access at http://localhost:8080
### Permission Issues
```bash
# Fix permissions on mounted directories
sudo chown -R 1001:1001 config downloads media
```
## Advanced Configuration
### Custom Port
Edit `docker-compose.yml`:
```yaml
app:
ports:
- "8080:3000"
environment:
NEXTAUTH_URL: http://localhost:8080
```
### External Database
To use an external PostgreSQL instance:
1. Remove the `postgres` service from `docker-compose.yml`
2. Update `DATABASE_URL` to point to your external database
3. Ensure network connectivity
### External Redis
To use an external Redis instance:
1. Remove the `redis` service from `docker-compose.yml`
2. Update `REDIS_URL` to point to your external Redis
3. Ensure network connectivity
### Resource Limits
Add resource limits in `docker-compose.yml`:
```yaml
app:
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
reservations:
cpus: '1.0'
memory: 512M
```
## Production Deployment
### Recommended Changes for Production
1. **Use Strong Secrets**
- Generate unique NEXTAUTH_SECRET
- Use strong PostgreSQL password
- Never commit secrets to git
2. **Enable HTTPS**
- Use a reverse proxy (nginx, Traefik, Caddy)
- Obtain SSL certificate (Let's Encrypt)
- Update NEXTAUTH_URL to https://
3. **Configure Plex OAuth**
- Register application at https://www.plex.tv/
- Add PLEX_CLIENT_ID and PLEX_CLIENT_SECRET
4. **Set Up Backups**
- Automated database backups
- Volume snapshots
- Off-site backup storage
5. **Monitor Resources**
- Set up logging aggregation
- Monitor disk space
- Track application performance
## Environment Variables Reference
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `DATABASE_URL` | Yes | - | PostgreSQL connection string |
| `REDIS_URL` | Yes | - | Redis connection string |
| `NEXTAUTH_URL` | Yes | - | Application URL |
| `NEXTAUTH_SECRET` | Yes | - | JWT secret (min 32 chars) |
| `PLEX_CLIENT_ID` | No | - | Plex OAuth client ID |
| `PLEX_CLIENT_SECRET` | No | - | Plex OAuth client secret |
| `NODE_ENV` | No | production | Node environment |
| `LOG_LEVEL` | No | info | Logging level |
| `PORT` | No | 3000 | Application port |
## Support
For issues and questions:
- Check logs: `docker compose logs`
- Verify health: http://localhost:3000/api/health
- Review documentation: `/documentation`
## Architecture
```
┌─────────────────────────────────────────────────────────┐
│ Docker Compose │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────┐ │
│ │ readmeabook-app (Next.js) │ │
│ │ Port: 3000 │ │
│ │ Volumes: /config, /downloads, /media │ │
│ └──────────────────┬──────────────┬───────────────┘ │
│ │ │ │
│ ┌──────────────────▼──────┐ ┌───▼──────────────┐ │
│ │ postgres:16-alpine │ │ redis:7-alpine │ │
│ │ Port: 5432 (internal) │ │ Port: 6379 │ │
│ │ Volume: pgdata │ │ Volume: redisdata│ │
│ └─────────────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
Host Directories:
./config → /app/config (application configuration)
./downloads → /downloads (temporary torrent downloads)
./media → /media (organized audiobook library)
```
## Next Steps
After deployment:
1. Complete setup wizard at http://localhost:3000/setup
2. Configure external services (Plex, Prowlarr, qBittorrent)
3. Create user accounts
4. Start requesting audiobooks!