soulsync/DOCKER_PERMISSIONS.md
Broque Thomas 2f8bad23a8 Add manual track matching and Docker permission docs
Implements manual track matching (discovery fix modal) for YouTube, Tidal, and Beatport platforms, allowing users to search and select Spotify tracks for unmatched results. Adds backend endpoints and frontend logic for updating matches, improves conversion of discovery results for sync/download, and updates Dockerfile/entrypoint for dynamic PUID/PGID/UMASK support. Includes a new DOCKER_PERMISSIONS.md guide.
2025-10-03 10:48:25 -07:00

238 lines
5.3 KiB
Markdown

# Docker Permissions Guide
## Understanding PUID/PGID/UMASK
SoulSync supports dynamic user/group ID configuration to ensure files are created with the correct ownership, especially important when sharing files with other containers like Lidarr, Sonarr, or Plex.
### What are PUID and PGID?
- **PUID** (Process User ID): The numeric user ID the container runs as
- **PGID** (Process Group ID): The numeric group ID the container runs as
- **UMASK**: Controls default permissions for newly created files/directories
## Quick Start
### Finding Your IDs
On your host system, run:
```bash
id your_username
```
Example output:
```
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),999(docker)
```
Your PUID is `1000` and PGID is `1000`.
### Matching Lidarr/Sonarr/Plex
If you're using SoulSync with Lidarr, check Lidarr's docker-compose to see what PUID/PGID it uses:
```yaml
# Your Lidarr container
services:
lidarr:
environment:
- PUID=99
- PGID=100
```
Then set SoulSync to match:
```yaml
# Your SoulSync container
services:
soulsync:
environment:
- PUID=99 # Match Lidarr
- PGID=100 # Match Lidarr
- UMASK=002 # Allows group write permissions
```
## Common Scenarios
### Scenario 1: Sharing with Lidarr (Unraid)
**Problem**: Lidarr can't import files downloaded by SoulSync
**Solution**: Match the PUID/PGID
```yaml
services:
soulsync:
environment:
- PUID=99 # Common Unraid user
- PGID=100 # Common Unraid group
- UMASK=002
```
### Scenario 2: Single User System
**Problem**: Default 1000:1000 works but want to match your user
**Solution**: Use your user's IDs (run `id` command)
```yaml
services:
soulsync:
environment:
- PUID=1000 # Your user ID
- PGID=1000 # Your group ID
- UMASK=022
```
### Scenario 3: Multiple Containers Sharing Files
**Problem**: Multiple containers (Plex, Lidarr, SoulSync) need access to same files
**Solution**: All containers should use same PUID/PGID
```yaml
services:
plex:
environment:
- PUID=1000
- PGID=1000
lidarr:
environment:
- PUID=1000
- PGID=1000
soulsync:
environment:
- PUID=1000
- PGID=1000
- UMASK=002 # Allows all containers to write
```
## UMASK Values Explained
UMASK controls default permissions:
- **022**: Files: `644` (rw-r--r--), Directories: `755` (rwxr-xr-x)
- Owner: read/write
- Group: read only
- Others: read only
- **Use when**: Only you need to modify files
- **002**: Files: `664` (rw-rw-r--), Directories: `775` (rwxrwxr-x)
- Owner: read/write
- Group: read/write
- Others: read only
- **Use when**: Multiple containers share the same group and need write access
- **000**: Files: `666` (rw-rw-rw-), Directories: `777` (rwxrwxrwx)
- Everyone: full access
- **Use when**: Not recommended (security risk)
## Troubleshooting
### Permission Denied Errors
**Symptom**:
```
Permission denied: Access to the path '/music/Artist/Album/track.flac' is denied.
```
**Diagnosis**:
1. Check file ownership:
```bash
ls -la /path/to/music/Artist/Album/
```
2. Check what user Lidarr runs as:
```bash
docker exec lidarr id
```
3. Check what user SoulSync runs as:
```bash
docker exec soulsync-webui id
```
**Fix**: Ensure both containers use the same PUID/PGID
### Files Created with Wrong Owner
**Symptom**: Files show as `1000:1000` even though you set `PUID=99 PGID=100`
**Cause**: Container needs to be rebuilt after changing PUID/PGID
**Fix**:
```bash
docker-compose down
docker-compose up -d
```
### Existing Files Have Wrong Permissions
**Symptom**: Old files created before changing PUID/PGID have wrong ownership
**Fix**: Manually fix ownership:
```bash
# Find your download directory
docker exec soulsync-webui ls -la /app/downloads
# Fix ownership (run on host, not in container)
sudo chown -R 99:100 /path/to/downloads
```
## Advanced: Custom Entrypoint
The container uses `/entrypoint.sh` to handle PUID/PGID. When the container starts:
1. Reads `PUID`, `PGID`, `UMASK` environment variables
2. Changes the internal `soulsync` user to match those IDs
3. Fixes permissions on app directories
4. Starts Python app as that user
You can verify this by checking container logs:
```bash
docker logs soulsync-webui
```
Look for:
```
🐳 SoulSync Container Starting...
📝 User Configuration:
PUID: 99
PGID: 100
UMASK: 002
🔧 Adjusting user permissions...
Changing group ID from 1000 to 100
Changing user ID from 1000 to 99
🚀 Starting SoulSync Web Server...
```
## Example docker-compose.yml
```yaml
version: '3.8'
services:
soulsync:
image: boulderbadgedad/soulsync:latest
container_name: soulsync-webui
environment:
# Match these to your Lidarr/Plex/other containers
- PUID=99
- PGID=100
- UMASK=002
- TZ=America/New_York
ports:
- "8008:8008"
volumes:
- ./config:/app/config
- ./logs:/app/logs
- ./downloads:/app/downloads
- /mnt/user/Music:/music:rw # Shared music library
restart: unless-stopped
```
## Need Help?
If you're still experiencing permission issues:
1. Check container logs: `docker logs soulsync-webui`
2. Verify PUID/PGID: `docker exec soulsync-webui id`
3. Check file permissions: `docker exec soulsync-webui ls -la /app/downloads`
4. Open an issue on GitHub with the output of these commands