Symptom: Login fails with “Could not validate credentials” error.Possible causes:
Wrong username or password
User account deactivated
Database corruption
JWT token issues
Solutions:Reset admin password:
# Access database directlydocker exec -it borg-web-ui sqlite3 /data/borg.db# Check if admin user existsSELECT username, is_active FROM users WHERE username='admin';# If user is deactivatedUPDATE users SET is_active=1 WHERE username='admin';# Exit and regenerate password.quit
Then recreate admin user via first-run mechanism:
# Delete admin user (will be recreated on startup)docker exec borg-web-ui sqlite3 /data/borg.db "DELETE FROM users WHERE username='admin';"# Restart container (admin user recreated with default password)docker restart borg-web-ui# Login with admin/admin123, change password immediately
Check JWT secret key:
# Verify SECRET_KEY existsdocker exec borg-web-ui cat /data/.secret_key# If missing, restart to regeneratedocker restart borg-web-ui
Proxy authentication not working
Symptom: With DISABLE_AUTHENTICATION=true, still prompted for login.Diagnosis:Check environment variables:
docker exec borg-web-ui env | grep DISABLE_AUTHENTICATION# Should show: DISABLE_AUTHENTICATION=true
Check reverse proxy headers:
# Test with curlcurl -H "X-Forwarded-User: testuser" http://localhost:8081/api/users/me
# Check if system key existsdocker exec borg-web-ui test -f /home/borg/.ssh/id_ed25519 && echo "Key exists" || echo "Key missing"# If missing, generate via UI:# Remote Machines → Generate System Key
Symptom: Backup fails with “Failed to create/acquire the lock” or “Timeout waiting for lock”.Cause: Another Borg process is using the repository, or stale lock file exists.Solutions:Wait for other operation to complete:
# Check for running Borg processesdocker exec borg-web-ui ps aux | grep borg# View active backup jobs in UI# Jobs → Active Jobs → Check for running operations
Break stale lock (if no operation is running):
# For local repositorydocker exec borg-web-ui borg break-lock /path/to/repo# For SSH repository docker exec borg-web-ui borg break-lock user@host:/path/to/repo
Only break lock if you’re certain no other Borg process is running. Breaking an active lock can corrupt the repository!
Configure bypass lock (for read operations):
# Repository → Settings → Advanced# Enable: "Bypass lock on info operations"# Enable: "Bypass lock on list operations"
This allows browsing archives while backups are running (from migration 061_add_bypass_lock_on_info.py and 069_add_bypass_lock_on_list.py).
Backup timeout - Operation exceeded timeout
Symptom: Backup fails with timeout error after running for configured duration.Solutions:Increase backup timeout:
# Via UI: Settings → System → Operation Timeouts# Backup timeout: 7200 (2 hours)# Via environment:environment: - BACKUP_TIMEOUT=7200
Check for stuck operations:
# View backup progress in real-timedocker logs -f borg-web-ui# Check if backup is making progress or hungdocker exec borg-web-ui ps aux | grep borg
Optimize backup performance:
Use faster compression: --compression lz4
Exclude unnecessary files: --exclude '*.tmp'
Check network speed for remote repositories
Out of space errors
Symptom: Backup fails with “No space left on device”.Diagnosis:
# Check repository disk spacedf -h /path/to/repository# Check Docker volume spacedocker exec borg-web-ui df -h /data# Check repository sizedocker exec borg-web-ui borg info /path/to/repo
Solutions:Run compact to reclaim space:
# Via UI: Repository → Maintenance → Compact Repository# Via CLI:docker exec borg-web-ui borg compact /path/to/repo
Run prune to delete old archives:
# Via UI: Repository → Maintenance → Prune Repository# Configure retention policy (keep last 7 daily, 4 weekly, etc.)
Increase repository volume size:
# For local repositories, ensure sufficient disk space# For remote repositories, check remote server capacity
Pre/Post backup scripts failing
Symptom: Backup fails during pre-backup or post-backup script execution.Diagnosis:
# View script execution logs# Jobs → Backup Job → Expand logs → Look for script output# Test script manuallydocker exec -it borg-web-ui bash# Paste script contents and run
Common issues:Script timeout:
# Via UI: Repository → Settings → Hooks# Increase: "Pre-hook timeout" or "Post-hook timeout" (default: 300s)
Symptom: Archive browsing is slow even after first load.Diagnosis:
# Check cache status in UI# Settings → Cache → Backend Type (should show "Redis")# Check if Redis is runningdocker ps | grep redis# Check Borg UI logsdocker logs borg-web-ui | grep -i cache# Should show: "Archive cache initialized with Redis backend"
Solutions:Redis not running:
# Start Redis containerdocker compose up -d redis# Or if using standalone Redisdocker start redis-cache
Redis connection failed:
# Test connection from Borg UIdocker exec borg-web-ui redis-cli -h redis ping# Should return: PONG# For external Redisdocker exec borg-web-ui redis-cli -h 192.168.1.100 ping
# Test from host machineredis-cli -h 192.168.1.100 ping# Check firewall on Redis serversudo ufw allow 6379/tcp# Check Redis is binding to correct interfacedocker exec redis-cache redis-cli CONFIG GET bind# Should show: 0.0.0.0 (not 127.0.0.1)
Verify Redis URL format:
# Correct formats:redis://redis:6379/0 # Local Dockerredis://192.168.1.100:6379/0 # External no passwordredis://:password@192.168.1.100:6379/0 # External with password
Cache showing old data after repository changes
Symptom: Archive list or contents show outdated data after backup/prune.Solution:
# Clear cache via UI# Settings → Cache → Clear All Cache# Or clear specific repository cache via Redis CLIdocker exec -it borg-redis redis-cli> KEYS archive:1:* # List all archives for repo ID 1> DEL archive:1:my-old-archive # Delete specific cache entry> FLUSHDB # Or clear entire cache
Auto-clear cache after operations:
Cache is automatically cleared for a repository after prune/compact operations
Symptom: “Repository does not exist” or “Permission denied” when accessing repository.For local repositories:
# Check if path existsdocker exec borg-web-ui ls -la /path/to/repo# Check permissionsdocker exec borg-web-ui stat /path/to/repo# Verify it's a Borg repositorydocker exec borg-web-ui test -f /path/to/repo/config && echo "Valid repo" || echo "Not a Borg repo"
For SSH repositories:
# Test SSH accessdocker exec borg-web-ui ssh user@host ls -la /path/to/repo# Test with Borgdocker exec borg-web-ui borg list user@host:/path/to/repo
Common causes:
Typo in repository path - Check path spelling
Missing volume mount - Ensure path is mounted in docker-compose.yml
Wrong permissions - Repository not readable by container user (UID 1000)
SSH key not deployed - For remote repositories
Corrupt repository or index
Symptom: Borg errors mentioning “corrupted” or “integrity check failed”.Solutions:
Repository corruption is rare but serious. Always maintain offsite backups.
Run repository check:
# Via UI: Repository → Maintenance → Check Repository# Via CLI:docker exec borg-web-ui borg check /path/to/repo# Deep check (slower, more thorough)docker exec borg-web-ui borg check --verify-data /path/to/repo
Repair repository:
# Repair with --repair flag (USE WITH CAUTION)docker exec borg-web-ui borg check --repair /path/to/repo
Rebuild index:
# If only the cache/index is corrupteddocker exec borg-web-ui rm -rf /home/borg/.cache/borg/*docker exec borg-web-ui borg list /path/to/repo # Rebuilds cache