From b1199804b0df22003370ad8299e49569dce96368 Mon Sep 17 00:00:00 2001 From: Armand Gillot <79774155+armandgillot@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:40:30 +0100 Subject: [PATCH] Add Maintainerr (#2316) * Add Maintainerr * fix port * fix port * fix port * fix --- apps/maintainerr/config.json | 19 ++++++++++ apps/maintainerr/docker-compose.yml | 42 +++++++++++++++++++++++ apps/maintainerr/metadata/description.md | 36 +++++++++++++++++++ apps/maintainerr/metadata/logo.jpg | Bin 0 -> 15325 bytes 4 files changed, 97 insertions(+) create mode 100644 apps/maintainerr/config.json create mode 100644 apps/maintainerr/docker-compose.yml create mode 100644 apps/maintainerr/metadata/description.md create mode 100644 apps/maintainerr/metadata/logo.jpg diff --git a/apps/maintainerr/config.json b/apps/maintainerr/config.json new file mode 100644 index 00000000..b61d2b71 --- /dev/null +++ b/apps/maintainerr/config.json @@ -0,0 +1,19 @@ +{ + "name": "Maintainerr", + "available": true, + "exposable": true, + "port": 8030, + "id": "maintainerr", + "tipi_version": 1, + "version": "1.7.1", + "categories": [ + "media", + "utilities" + ], + "description": "Maintainerr will manage the storage space on your plex server, launching automated actions to delete your files.", + "short_desc": "Maintainerr will manage the storage space on your plex server, launching automated actions to delete your files.", + "author": "jorenn92", + "source": "https://github.com/jorenn92/Maintainerr", + "form_fields": [], + "supported_architectures": ["arm64", "amd64"] +} diff --git a/apps/maintainerr/docker-compose.yml b/apps/maintainerr/docker-compose.yml new file mode 100644 index 00000000..e3f24a4c --- /dev/null +++ b/apps/maintainerr/docker-compose.yml @@ -0,0 +1,42 @@ +version: '3' + +services: + maintainerr: + image: ghcr.io/jorenn92/maintainerr:1.7.1 # or jorenn92/maintainerr:1.7.1 + container_name: maintainerr +# user: 1000:1000 # only use this with release 2.0 and up + volumes: + - ${APP_DATA_DIR}/data/config:/opt/data + environment: + - TZ=${TZ} +# - DEBUG=true # uncomment to enable verbose logs + ports: + - ${APP_PORT}:80 + restart: unless-stopped + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.maintainerr-web-redirect.redirectscheme.scheme: https + traefik.http.services.maintainerr.loadbalancer.server.port: 8030 + # Web + traefik.http.routers.maintainerr-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.maintainerr-insecure.entrypoints: web + traefik.http.routers.maintainerr-insecure.service: maintainerr + traefik.http.routers.maintainerr-insecure.middlewares: maintainerr-web-redirect + # Websecure + traefik.http.routers.maintainerr.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.maintainerr.entrypoints: websecure + traefik.http.routers.maintainerr.service: maintainerr + traefik.http.routers.maintainerr.tls.certresolver: myresolver + # Local domain + traefik.http.routers.maintainerr-local-insecure.rule: Host(`maintainerr.${LOCAL_DOMAIN}`) + traefik.http.routers.maintainerr-local-insecure.entrypoints: web + traefik.http.routers.maintainerr-local-insecure.service: maintainerr + traefik.http.routers.maintainerr-local-insecure.middlewares: maintainerr-web-redirect + # Local domain secure + traefik.http.routers.maintainerr-local.rule: Host(`maintainerr.${LOCAL_DOMAIN}`) + traefik.http.routers.maintainerr-local.entrypoints: websecure + traefik.http.routers.maintainerr-local.service: maintainerr + traefik.http.routers.maintainerr-local.tls: true diff --git a/apps/maintainerr/metadata/description.md b/apps/maintainerr/metadata/description.md new file mode 100644 index 00000000..a7122556 --- /dev/null +++ b/apps/maintainerr/metadata/description.md @@ -0,0 +1,36 @@ +Maintainerr makes managing your media easy. + +- Do you hate being the janitor of your server? +- Do you have a lot of media that never gets watched? +- Do your users constantly request media, and let it sit there afterward never to be touched again? + +If you answered yes to any of those questions.. You NEED Maintainerr. +It's a one-stop-shop for handling those outlying shows and movies that take up precious space on your server. + +# Features + +- Configure rules specific to your needs, based off of several available options from Plex, Overseerr, Radarr, and Sonarr. +- Manually add media to a collection, in case it's not included after rule execution. (one-off items that don't match a rule set) +- Selectively exclude media from being added to a collection, even if it matches a rule. +- Show a collection, containing rule matched media, on the Plex home screen for a specific duration before deletion. Think "Leaving soon". +- Optionally, use a manual Plex collection, in case you don't want Maintainerr to add & remove Plex collections at will. +- Manage media straight from the collection within Plex. Maintainerr will sync and add or exclude media to/from the internal collection. + +- Remove or unmonitor media from \*arr +- Clear requests from Overseerr +- Delete files from disk + +
+Currently, Maintainerr supports rule parameters from these apps : + +- Plex +- Overseerr +- Radarr +- Sonarr + +# Preview + +![image](https://raw.githubusercontent.com/jorenn92/Maintainerr/main/ui/public/screenshots/overview_screenshot.png) +![image](https://raw.githubusercontent.com/jorenn92/Maintainerr/main/ui/public/screenshots/rules_screenshot.png) +![image](https://raw.githubusercontent.com/jorenn92/Maintainerr/main/ui/public/screenshots/collections_screenshot.png) +![image](https://raw.githubusercontent.com/jorenn92/Maintainerr/main/ui/public/screenshots/rule_example_screenshot.png) \ No newline at end of file diff --git a/apps/maintainerr/metadata/logo.jpg b/apps/maintainerr/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1359c8d5446b0eed514136a91bce30797de10fe6 GIT binary patch literal 15325 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 ALjV8( literal 0 HcmV?d00001