mirror of
https://github.com/kikootwo/ReadMeABook.git
synced 2026-06-03 04:40:09 +00:00
Initial commit
This commit is contained in:
@@ -0,0 +1,367 @@
|
||||
# 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!
|
||||
Reference in New Issue
Block a user