mirror of
https://github.com/kikootwo/ReadMeABook.git
synced 2026-06-02 20:30:10 +00:00
368 lines
8.3 KiB
Markdown
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!
|