You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Jellystat will start tracking watch history, user activity, and library statistics automatically.
96
98
99
+
## Optional: Cloud Storage (rclone + mergerfs)
100
+
101
+
Transparent cloud/local merged library. rclone FUSE-mounts your cloud storage inside Docker (where FUSE works natively), mergerfs overlays it with local storage, and all existing services see a single unified path. Local-first writes keep downloads fast; a periodic upload script moves stable media to the cloud.
102
+
103
+
Supports Google Drive, S3, Backblaze B2, Dropbox, and [40+ other providers](https://rclone.org/overview/).
104
+
105
+
### Compatibility Requirements (macOS)
106
+
107
+
- Set `MEDIA_SERVER=jellyfin` for cloud-backed playback.
108
+
- Set `TDARR_MODE=docker` if you use Tdarr with cloud storage.
|`CLOUD_UPLOAD_MIN_AGE_HOURS`|`24`| Only upload files older than this |
152
+
153
+
**Cloud mode note:** Use `TDARR_MODE=docker` when cloud storage is enabled. Native Tdarr cannot access merged Docker FUSE mounts on macOS.
154
+
97
155
## Optional: Music (Lidarr + Tidarr)
98
156
99
157
| Service | What It Does |
@@ -108,6 +166,12 @@ bash scripts/setup-music.sh
108
166
docker compose --profile music up -d
109
167
```
110
168
169
+
If cloud storage is enabled, use:
170
+
171
+
```bash
172
+
docker compose -f docker-compose.yml -f docker-compose.cloud-storage.yml --profile cloud-storage --profile music up -d
173
+
```
174
+
111
175
Then open Tidarr at `http://localhost:8484` to authenticate with your Tidal account, and Lidarr at `http://localhost:8686` to configure your music library. See the [Music Setup](#music-setup) section below for details.
112
176
113
177
## Automation
@@ -121,6 +185,7 @@ Then open Tidarr at `http://localhost:8484` to authenticate with your Tidal acco
121
185
| Log prune | Daily | Removes log files older than 30 days |
122
186
| Franchise sort | Optional/manual | Sorts franchise collection movies by release date in Plex (Plex only) |
123
187
| VPN failover | Every 2 min (optional) | Auto-switches between ProtonVPN and NordVPN on sustained failure |
188
+
| Cloud upload | Every 6 hours (optional) | Moves local media older than 24h to cloud storage |
124
189
| Watchtower | Daily at 04:00 (optional) | Auto-pulls latest container images and recreates updated services |
125
190
126
191
Franchise sorting is kept manual by default because it requires your Plex token:
|`scripts/run-kometa.sh`| Trigger Kometa metadata run |
358
+
|`scripts/setup-cloud-storage.sh`| Sets up rclone + mergerfs cloud storage integration |
359
+
|`scripts/cloud-upload.sh`| Periodic upload of local media to cloud storage |
293
360
|`scripts/setup-music.sh`| Creates music directories and Tidarr config (optional) |
294
361
|`scripts/log-prune.sh`| Prunes old log files (30-day default retention) |
295
362
|`scripts/franchise-sort.py`| Auto-sorts franchise collections in Plex by release date (Plex only) |
@@ -340,6 +407,12 @@ docker compose --profile music up -d
340
407
# Host: gluetun, Port: 8080
341
408
```
342
409
410
+
If cloud storage is enabled, use this start command in step 2 instead:
411
+
412
+
```bash
413
+
docker compose -f docker-compose.yml -f docker-compose.cloud-storage.yml --profile cloud-storage --profile music up -d
414
+
```
415
+
343
416
### Tidarr Download Config
344
417
345
418
The setup script creates a default `tiddl` config at `<MEDIA_DIR>/config/tidarr/.tiddl/config.toml` (default `<MEDIA_DIR>` is `~/Media`). Key settings:
If cloud storage is enabled, include both compose files and profiles when starting music services:
465
+
466
+
```bash
467
+
docker compose -f docker-compose.yml -f docker-compose.cloud-storage.yml --profile cloud-storage --profile music up -d
468
+
```
469
+
391
470
## Media Archiving
392
471
393
472
If you're running out of space on your primary drive, the archive script moves old or watched media to an external drive. Dry-run by default so you can preview what would be moved before committing.
Copy file name to clipboardExpand all lines: SETUP.md
+60Lines changed: 60 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -268,6 +268,7 @@ Replace `YOUR_PLEX_TOKEN` and `YOUR_TMDB_API_KEY`, then save.
268
268
- Movies source: `/movies`
269
269
- TV source: `/tv`
270
270
- Temp/cache: `/temp`
271
+
- If `CLOUD_STORAGE_ENABLED=true`, use `TDARR_MODE=docker` so Tdarr can read merged cloud paths.
271
272
3. Assign the preloaded flow: `Quality-First HEVC (Resolution Preserving)`
272
273
4. Keep the defaults in that flow for quality-first behavior:
273
274
- No resolution downscale
@@ -334,6 +335,65 @@ Everything else is fully automated.
334
335
335
336
---
336
337
338
+
## Optional: Cloud Storage (rclone + mergerfs)
339
+
340
+
If your local disk is too small for your full library, cloud storage lets you extend it transparently. rclone mounts your cloud provider (Google Drive, S3, B2, Dropbox, etc.) inside Docker, and mergerfs overlays it with your local storage so all services see one unified library.
Or pass `--cloud-storage` to `bootstrap.sh` for a full install.
367
+
368
+
### How it works
369
+
370
+
-**Write path:** Downloads land on local disk (fast). Every 6 hours, `cloud-upload.sh` moves files older than 24h to the cloud via `rclone move`.
371
+
-**Read path:** Docker services (Jellyfin, Arr apps, Tdarr Docker) read from the mergerfs overlay, which transparently serves files from local or cloud storage.
372
+
-**VFS cache:** rclone caches recently accessed cloud files locally (default 50GB, 72h max age). Adjust `RCLONE_VFS_CACHE_MAX_SIZE` in `.env` based on your available disk space.
373
+
374
+
### Library paths when cloud storage is enabled
375
+
376
+
-**Jellyfin (Docker):** keep default container paths `/data/movies` and `/data/tvshows` (mapped to merged paths by compose override).
377
+
-**Tdarr Docker mode:** keep `/movies` and `/tv` (mapped to merged paths by compose override).
378
+
379
+
### Troubleshooting cloud storage
380
+
381
+
```bash
382
+
# Check rclone and mergerfs health
383
+
bash scripts/health-check.sh
384
+
385
+
# View cloud upload logs
386
+
tail -50 ~/Media/logs/cloud-upload.log
387
+
388
+
# Test rclone connectivity
389
+
docker exec rclone-mount rclone ls myremote: --max-depth 1
390
+
391
+
# Restart cloud storage (order matters: rclone first, then mergerfs)
0 commit comments