Compare commits

...

26 Commits

Author SHA1 Message Date
Chris King
ff4bea25f6 Add initial commit of new media management docker stack
Includes transmission, gluetun, sonarr, radarr stacks
Includes framework for adding plex, tautulli, prowlarr, overseerr, requestrr, and trash guides sync stacks
Includes port-watcher docker container that monitors gluetun port forwarding file and sets transmission peer_port automatically
2025-03-12 10:47:54 -07:00
Chris King
2abb9cb5d2 Add script for managing torrentarr containers (not in use) 2025-03-12 10:45:08 -07:00
Chris King
8231589d4d Update Overseer lastscan times 2025-03-12 10:44:38 -07:00
Chris King
1ffdc6caaf Add custom TimestampTrade plugin
Add custom RemoveMarkers plugin
2025-03-12 10:43:57 -07:00
Chris King
eb5693322d Update stashapp config 2025-03-12 10:43:10 -07:00
Chris King
773fb9067b Rename stashapp matcher to @exclude
Update stashapp exclusions
2025-03-12 10:37:43 -07:00
Chris King
31a5e76cee Disable DupFileManager Stash plugin dryrun mode 2025-02-18 01:19:53 -08:00
Chris King
db5394a2c5 Remove logging options from Stash docker-compose.yml so that it uses defaults (journald) 2025-02-18 01:19:18 -08:00
Chris King
e07521a6ae Migrate Seedsync setup to /docker directory
Now able to track and backup all seedsync configs
Add config backups to gitignore for Seedsync
2025-02-18 01:17:53 -08:00
Chris King
8a2240a43e Finish Komodo setup
Add OIDC snippet to Caddyfile
Add komodo to Caddyfile
2025-02-18 01:12:53 -08:00
Chris King
0dcd0c9823 Move Caddy named volumes to bind mounts for backup 2025-02-18 01:10:39 -08:00
Chris King
5ffc709df3 Move Authentik named volumes to bind mounts for backup 2025-02-18 01:10:03 -08:00
Chris King
a572313d3d Moved DupFileManager plugin to a fork in Gitea and moved the files to a new directory 2025-02-16 06:20:19 -08:00
Chris King
8de9b57365 Move Stash to Authentik
Add bypass for bedroom ShieldTV
Remove Stash port forwarding
Set STASH_EXTERNAL_HOST to URL
Add customized DupFileManager plugin to Stash
Enable custom_served_folders in Stash
Disable built-in Stash auth in favor of Authentik
Add additional Stash plugins and plugin sources
Add FansDB stash box configuration
2025-02-16 01:20:53 -08:00
Chris King
79aa347f6a Change default Authentik snippet to only modify X-Real-IP and X-Forwarded-Port headers
Caddy passes through and sets other headers automatically
Only use Cloudflare connecting IP header when request is coming from cloudflare
2025-02-16 01:16:36 -08:00
Chris King
d2810af09f Corrected accidental string bool 2025-02-13 16:11:35 -08:00
Chris King
aaaaa7766e Added additional motion masks for timestamps
Added zone definitions for all cameras
Adjusted motion threshhold and contour_area for all cameras
2025-02-13 16:10:18 -08:00
Chris King
b532587d76 stashapp - Added new transfer directory 2025-02-13 16:08:11 -08:00
Chris King
8749ca7376 Moved Tautulli to Docker
Added tautulli.tremendousturtle.tools to Caddy
Added additional gitignore file for Tautulli
2025-02-13 16:07:23 -08:00
Chris King
12a0e84181 Default Komodo setup 2025-02-04 02:22:58 -08:00
Chris King
aa51e224f8 Add network bandwidth monitoring for frigate
Add Frigate+ API key to enable image annotation/upload
Adjust doorbell motion parameters
Adjust detect stationary threshold
Enable recording retention for all 3 days and 30 days for motion
2025-02-04 02:22:38 -08:00
Chris King
67a8025b49 Add Dozzle to Caddy 2025-02-04 02:20:13 -08:00
Chris King
d2942bf100 Revert Authentik to stable build version 2024.12.3 2025-02-04 02:19:56 -08:00
Chris King
2d1ac160e7 Setup Dozzle 2025-02-04 02:19:17 -08:00
Chris King
3d4cdaf8d6 Enable frigate snapshots
Add additional objects to track
2025-01-30 21:15:07 -08:00
Chris King
7f5284c865 Enable repository indexing service
Enable reverse proxy trusted proxies
2025-01-23 09:24:34 -08:00
33 changed files with 1292 additions and 664 deletions

View File

@@ -10,7 +10,7 @@ services:
retries: 5
timeout: 5s
volumes:
- database:/var/lib/postgresql/data
- ./data/postgres:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
POSTGRES_USER: ${PG_USER:-authentik}
@@ -28,9 +28,9 @@ services:
retries: 5
timeout: 3s
volumes:
- redis:/data
- ./data/redis:/data
app:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2024.12.2}
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2024.12.3}
restart: unless-stopped
command: server
environment:
@@ -61,7 +61,7 @@ services:
redis:
condition: service_healthy
worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2024.12.2}
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2024.12.3}
restart: unless-stopped
command: worker
environment:
@@ -90,12 +90,6 @@ services:
redis:
condition: service_healthy
volumes:
database:
driver: local
redis:
driver: local
networks:
proxy-net:
external: true

View File

@@ -78,9 +78,35 @@
{args[0]}.tremendousturtle.tools {
import ttt-log {args[0]}
import tls
reverse_proxy authentik-app-1:9000 {
@not_cf header !CF-Connecting-IP
@cf header CF-Connecting-IP *
reverse_proxy @not_cf authentik-app-1:9000 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Port {server_port}
}
reverse_proxy @cf authentik-app-1:9000 {
header_up X-Real-IP {http.request.header.CF-Connecting-IP}
header_up X-Forwarded-For {http.request.header.CF-Connecting-IP}
header_up X-Forwarded-Port {server_port}
}
}
}
(oidc) {
{args[0]}.tremendousturtle.tools {
import ttt-log {args[0]}
import tls
@not_cf header !CF-Connecting-IP
@cf header CF-Connecting-IP *
reverse_proxy @not_cf {args[0]}-app-1:{args[1]} {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Port {server_port}
}
reverse_proxy @cf {args[0]}-app-1:{args[1]} {
header_up X-Real-IP {http.request.header.CF-Connecting-IP}
header_up X-Forwarded-Port {server_port}
}
}
}
@@ -152,7 +178,7 @@ import ttt-app requestrr 4545
import ttt-app-alt budget actual-server-app-1 5006
import ttt-app-alt trilium triliumnext-notes-app-1 8080
import ttt-app-alt notes triliumnext-notes-app-1 8080
import ttt-app-alt stash stashapp-app-1 9999
#import ttt-app-alt stash stashapp-app-1 9999
import ttt-app-alt pihole1 192.168.1.116 80
# Authentik Configs
@@ -162,3 +188,34 @@ import redirect home homepage
import authentik frigate
import authentik code
import authentik gitea
import authentik dozzle
import authentik tautulli
#import authentik-test stash
# Authentik OIDC Configs
import oidc komodo 9120
stash.tremendousturtle.tools {
import ttt-log stash
import tls
@not_cf header !CF-Connecting-IP
@cf header CF-Connecting-IP *
# Match the bedroom Nvidia Shield IP to skip Authentik
@exclude client_ip 192.168.1.142 192.168.1.234 127.0.0.1
reverse_proxy @exclude stashapp-app-1:9999 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Port {server_port}
}
# When not from cloudflare just use the remote host as the real IP
reverse_proxy @not_cf authentik-app-1:9000 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Port {server_port}
}
# When from cloudflare tunnel use the CF-Connecting-IP as the real IP
reverse_proxy @cf authentik-app-1:9000 {
header_up X-Real-IP {http.request.header.CF-Connecting-IP}
header_up X-Forwarded-Port {server_port}
}

View File

@@ -17,13 +17,9 @@ services:
- ./data/site:/srv
- ./data/logs:/logs
- ./config:/etc/caddy
- caddy_data:/data
- caddy_config:/config
- ./data/caddy_data:/data
- ./data/caddy_config:/config
networks:
proxy-net:
external: true
volumes:
caddy_data:
caddy_config:

19
dozzle/docker-compose.yml Normal file
View File

@@ -0,0 +1,19 @@
name: dozzle
services:
app:
image: amir20/dozzle:latest
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
expose:
- "8080"
environment:
DOZZLE_AUTH_PROVIDER: forward-proxy
DOZZLE_ENABLE_ACTIONS: true
DOZZLE_HOSTNAME: dozzle.tremendousturtle.tools
networks:
- proxy-net
networks:
proxy-net:
external: true

View File

@@ -38,8 +38,19 @@ objects:
track:
- person
- car
- motorcycle
- bicycle
- dog
- cat
- license plate
- face
- amazon
- usps
- fedex
- ups
- package
- waste bin
cameras:
nw_garage:
@@ -64,6 +75,31 @@ cameras:
- 0.865,0.955,0.865,0.99,0.895,0.99,0.895,0.955
- 0.827,0.955,0.827,0.99,0.858,0.99,0.858,0.955
- 0.79,0.955,0.79,0.99,0.821,0.99,0.821,0.955
- 0.905,0.992,0.932,0.99,0.932,0.965,0.905,0.964
- 0.942,0.987,0.983,0.987,0.982,0.957,0.942,0.958
- 0.69,0.988,0.719,0.988,0.719,0.957,0.69,0.958
threshold: 35
contour_area: 15
improve_contrast: true
zones:
Front_Yard:
coordinates: 0,0.552,0.13,0.709,0.246,0.822,0.451,1,0,1
loitering_time: 0
objects:
- cat
- dog
- package
- person
- usps
- waste bin
Driveway:
coordinates:
0,0.494,0,0.549,0.131,0.706,0.251,0.824,0.454,1,1,1,1,0.37,0.856,0.33,0.743,0.296,0.569,0.253,0.451,0.225,0.264,0.324,0.177,0.372,0.043,0.461
loitering_time: 0
Street:
coordinates:
0,0.491,0.05,0.454,0.176,0.371,0.257,0.325,0.45,0.224,0.49,0.217,0.561,0.185,0.671,0.139,0.738,0.114,0.813,0.084,0.756,0.049,0.736,0.027,0.737,0,0.474,0,0.46,0.009,0.389,0.012,0.318,0.022,0,0.128
loitering_time: 0
ne_garage:
enabled: true
ffmpeg:
@@ -86,6 +122,33 @@ cameras:
- 0.865,0.955,0.865,0.99,0.895,0.99,0.895,0.955
- 0.827,0.955,0.827,0.99,0.858,0.99,0.858,0.955
- 0.79,0.955,0.79,0.99,0.821,0.99,0.821,0.955
- 0.905,0.992,0.932,0.99,0.932,0.965,0.905,0.964
- 0.942,0.987,0.983,0.987,0.982,0.957,0.942,0.958
- 0.69,0.988,0.719,0.988,0.719,0.957,0.69,0.958
- 0.86,0,0.849,0.11,1,0.187,1,0
threshold: 45
contour_area: 16
improve_contrast: true
zones:
Front_Yard:
coordinates:
0,0.247,0,0.417,0.07,0.391,0.16,0.363,0.287,0.332,0.406,0.306,0.518,0.286,0.314,0.18,0.21,0.195,0.119,0.212
loitering_time: 0
objects:
- cat
- dog
- package
- person
- usps
- waste bin
Driveway:
coordinates:
0,0.42,0,1,1,1,1,0.601,0.876,0.512,0.709,0.402,0.584,0.328,0.514,0.289,0.413,0.307,0.297,0.332,0.177,0.361,0.085,0.388
loitering_time: 0
Street:
coordinates:
0.043,0.059,0.132,0.102,0.205,0.131,0.311,0.176,0.414,0.229,0.523,0.287,0.527,0.293,0.622,0.348,0.697,0.392,0.79,0.452,0.901,0.526,1,0.598,1,0.203,0.612,0.024,0.473,0,0.043,0
loitering_time: 0
doorbell:
enabled: true
ffmpeg:
@@ -108,9 +171,26 @@ cameras:
- 0.79,0.003,0.79,0.035,0.82,0.035,0.82,0.003
- 0.828,0.003,0.828,0.035,0.858,0.035,0.858,0.003
- 0.866,0.003,0.866,0.035,0.896,0.035,0.896,0.003
threshold: 35
contour_area: 15
- 0.904,0.039,0.933,0.038,0.933,0.011,0.904,0.011
- 0.943,0.033,0.983,0.033,0.983,0.004,0.942,0.005
- 0.691,0.034,0.72,0.033,0.72,0.005,0.69,0.005
threshold: 40
contour_area: 13
improve_contrast: true
zones:
Front_Yard:
coordinates: 0,0.876,0,1,1,1,1,0.596,0.491,0.59
loitering_time: 0
objects:
- cat
- dog
- package
- person
- usps
- waste bin
Street:
coordinates: 0.363,0.583,0.643,0.591,0.644,0.524,0.363,0.522
loitering_time: 0
version: 0.14
camera_groups:
Birdseye:
@@ -128,4 +208,23 @@ camera_groups:
detect:
stationary:
interval: 50
threshold: 40
threshold: 50
snapshots:
enabled: true
retain:
default: 30
record:
enabled: true
retain:
days: 3
mode: all
events:
retain:
default: 30
mode: motion
telemetry:
stats:
network_bandwidth: true

View File

@@ -4,6 +4,9 @@ services:
restart: unless-stopped
#image: ghcr.io/blakeblackshear/frigate:stable
image: gitea.tremendousturtle.tools/chris/frigate:v0.14.1-web-admin-088ff992
cap_add:
- NET_ADMIN
- NET_RAW
shm_size: "250mb"
devices:
- /dev/apex_0:/dev/apex_0 # Passes a PCIe Coral
@@ -28,6 +31,8 @@ services:
- "5000:5000" # VS Code schema validation allowed
expose:
- "8971"
secrets:
- PLUS_API_KEY
environment:
LIBVA_DRIVER_NAME: "radeonsi" # FRIGATE_RTSP_PASSWORD: "69$nC*6$jADbc!"
labels:
@@ -43,3 +48,7 @@ services:
networks:
proxy-net:
external: true
secrets:
PLUS_API_KEY:
file: ./secrets/PLUS_API_KEY

View File

@@ -20,6 +20,13 @@ services:
GITEA__service__ENABLE_REVERSE_PROXY_AUTHENTICATION: true
GITEA__service__ENABLE_REVERSE_PROXY_AUTO_REGISTRATION: true
GITEA__service__ENABLE_REVERSE_PROXY_EMAIL: true
GITEA__indexer__REPO_INDEXER_ENABLED: true
GITEA__indexer__REPO_INDEXER_PATH: indexers/repos.bleve
GITEA__indexer__MAX_FILE_SIZE: 1048576
GITEA__indexer__REPO_INDEXER_INCLUDE: ""
GITEA__indexer__REPO_INDEXER_EXCLUDE: resources/bin/**
GITEA__security__REVERSE_PROXY_LIMIT: 2
GITEA__security__REVERSE_PROXY_TRUSTED_PROXIES: '172.31.0.0/16'
restart: unless-stopped
networks:
- gitea

131
komodo/.env Normal file
View File

@@ -0,0 +1,131 @@
####################################
# 🦎 KOMODO COMPOSE - VARIABLES 🦎 #
####################################
## These compose variables can be used with all Komodo deployment options.
## Pass these variables to the compose up command using `--env-file komodo/compose.env`.
## Additionally, they are passed to both Komodo Core and Komodo Periphery with `env_file: ./compose.env`,
## so you can pass any additional environment variables to Core / Periphery directly in this file as well.
## Stick to a specific version, or use `latest`
COMPOSE_KOMODO_IMAGE_TAG=latest
## Note: 🚨 Podman does NOT support local logging driver 🚨. See Podman options here:
## `https://docs.podman.io/en/v4.6.1/markdown/podman-run.1.html#log-driver-driver`
COMPOSE_LOGGING_DRIVER=journald # Enable log rotation with the local driver.
## DB credentials - Ignored for Sqlite
KOMODO_DB_USERNAME=admin
KOMODO_DB_PASSWORD_FILE=/run/secrets/KOMODO_DB_PASSWORD
## Configure a secure passkey to authenticate between Core / Periphery.
KOMODO_PASSKEY_FILE=/run/secrets/KOMODO_PASSKEY
#=-------------------------=#
#= Komodo Core Environment =#
#=-------------------------=#
## Full variable list + descriptions are available here:
## 🦎 https://github.com/mbecker20/komodo/blob/main/config/core.config.toml 🦎
## Note. Secret variables also support `${VARIABLE}_FILE` syntax to pass docker compose secrets.
## Docs: https://docs.docker.com/compose/how-tos/use-secrets/#examples
## Used for Oauth / Webhook url suggestion / Caddy reverse proxy.
KOMODO_HOST=https://komodo.tremendousturtle.tools
## Displayed in the browser tab.
KOMODO_TITLE=Komodo
## Create a server matching this address as the "first server".
## Use `https://host.docker.internal:8120` when using systemd-managed Periphery.
KOMODO_FIRST_SERVER=https://periphery:8120
## Make all buttons just double-click, rather than the full confirmation dialog.
KOMODO_DISABLE_CONFIRM_DIALOG=false
## Rate Komodo polls your servers for
## status / container status / system stats / alerting.
## Options: 1-sec, 5-sec, 15-sec, 1-min, 5-min.
## Default: 15-sec
KOMODO_MONITORING_INTERVAL="5-sec"
## Rate Komodo polls Resources for updates,
## like outdated commit hash.
## Options: 1-min, 5-min, 15-min, 30-min, 1-hr.
## Default: 5-min
KOMODO_RESOURCE_POLL_INTERVAL="1-min"
## Used to auth incoming webhooks. Alt: KOMODO_WEBHOOK_SECRET_FILE
KOMODO_WEBHOOK_SECRET_FILE=/run/secrets/KOMODO_WEBHOOK_SECRET
## Used to generate jwt. Alt: KOMODO_JWT_SECRET_FILE
KOMODO_JWT_SECRET_FILE=/run/secrets/KOMODO_JWT_SECRET
## Enable login with username + password.
KOMODO_LOCAL_AUTH=false
## Disable new user signups.
KOMODO_DISABLE_USER_REGISTRATION=false
## All new logins are auto enabled
KOMODO_ENABLE_NEW_USERS=false
## Disable non-admins from creating new resources.
KOMODO_DISABLE_NON_ADMIN_CREATE=false
## Allows all users to have Read level access to all resources.
KOMODO_TRANSPARENT_MODE=false
## Time to live for jwt tokens.
## Options: 1-hr, 12-hr, 1-day, 3-day, 1-wk, 2-wk
KOMODO_JWT_TTL="1-wk"
## OIDC Login
KOMODO_OIDC_ENABLED=true
## Must reachable from Komodo Core container
KOMODO_OIDC_PROVIDER=https://authentik.tremendousturtle.tools/application/o/komodo/
## Change the host to one reachable be reachable by users (optional if it is the same as above).
## DO NOT include the `path` part of the URL.
KOMODO_OIDC_REDIRECT_HOST=https://authentik.tremendousturtle.tools
## Your client credentials
KOMODO_OIDC_CLIENT_ID_FILE=/run/secrets/KOMODO_OIDC_CLIENT_ID # Alt: KOMODO_OIDC_CLIENT_ID_FILE
KOMODO_OIDC_CLIENT_SECRET_FILE=/run/secrets/KOMODO_OIDC_CLIENT_SECRET # Alt: KOMODO_OIDC_CLIENT_SECRET_FILE
## Make usernames the full email.
# KOMODO_OIDC_USE_FULL_EMAIL=true
## Add additional trusted audiences for token claims verification.
## Supports comma separated list, and passing with _FILE (for compose secrets).
# KOMODO_OIDC_ADDITIONAL_AUDIENCES=abc,123 # Alt: KOMODO_OIDC_ADDITIONAL_AUDIENCES_FILE
## Github Oauth
KOMODO_GITHUB_OAUTH_ENABLED=false
# KOMODO_GITHUB_OAUTH_ID= # Alt: KOMODO_GITHUB_OAUTH_ID_FILE
# KOMODO_GITHUB_OAUTH_SECRET= # Alt: KOMODO_GITHUB_OAUTH_SECRET_FILE
## Google Oauth
KOMODO_GOOGLE_OAUTH_ENABLED=false
# KOMODO_GOOGLE_OAUTH_ID= # Alt: KOMODO_GOOGLE_OAUTH_ID_FILE
# KOMODO_GOOGLE_OAUTH_SECRET= # Alt: KOMODO_GOOGLE_OAUTH_SECRET_FILE
## Aws - Used to launch Builder instances and ServerTemplate instances.
KOMODO_AWS_ACCESS_KEY_ID= # Alt: KOMODO_AWS_ACCESS_KEY_ID_FILE
KOMODO_AWS_SECRET_ACCESS_KEY= # Alt: KOMODO_AWS_SECRET_ACCESS_KEY_FILE
## Hetzner - Used to launch ServerTemplate instances
## Hetzner Builder not supported due to Hetzner pay-by-the-hour pricing model
KOMODO_HETZNER_TOKEN= # Alt: KOMODO_HETZNER_TOKEN_FILE
#=------------------------------=#
#= Komodo Periphery Environment =#
#=------------------------------=#
## Full variable list + descriptions are available here:
## 🦎 https://github.com/mbecker20/komodo/blob/main/config/periphery.config.toml 🦎
## Periphery passkeys must include KOMODO_PASSKEY to authenticate.
PERIPHERY_PASSKEYS_FILE=${KOMODO_PASSKEY_FILE}
## Specify the root directory used by Periphery agent.
PERIPHERY_ROOT_DIRECTORY=/etc/komodo
## Enable SSL using self signed certificates.
## Connect to Periphery at https://address:8120.
PERIPHERY_SSL_ENABLED=true
## If the disk size is overreporting, can use one of these to
## whitelist / blacklist the disks to filter them, whichever is easier.
## Accepts comma separated list of paths.
## Usually whitelisting just /etc/hostname gives correct size.
PERIPHERY_INCLUDE_DISK_MOUNTS=/etc/hostname
# PERIPHERY_EXCLUDE_DISK_MOUNTS=/snap,/etc/repos

115
komodo/docker-compose.yml Normal file
View File

@@ -0,0 +1,115 @@
################################
# 🦎 KOMODO COMPOSE - MONGO 🦎 #
################################
## This compose file will deploy:
## 1. MongoDB
## 2. Komodo Core
## 3. Komodo Periphery
name: komodo
services:
db:
image: mongo
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
command: --quiet --wiredTigerCacheSizeGB 0.25
restart: unless-stopped
logging:
driver: ${COMPOSE_LOGGING_DRIVER:-local}
networks:
- default
# ports:
# - 27017:27017
volumes:
- ./data/mongo-data:/data/db
- ./config/mongo-config:/data/configdb
environment:
MONGO_INITDB_ROOT_USERNAME: ${KOMODO_DB_USERNAME}
MONGO_INITDB_ROOT_PASSWORD_FILE: ${KOMODO_DB_PASSWORD_FILE}
secrets:
- KOMODO_DB_PASSWORD
app:
image: ghcr.io/mbecker20/komodo:${COMPOSE_KOMODO_IMAGE_TAG:-latest}
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
depends_on:
- db
logging:
driver: ${COMPOSE_LOGGING_DRIVER:-local}
networks:
- default
- proxy-net
ports:
- 9120:9120
env_file: ./.env
environment:
KOMODO_DATABASE_ADDRESS: db:27017
KOMODO_DATABASE_USERNAME: ${KOMODO_DB_USERNAME}
KOMODO_DATABASE_PASSWORD_FILE: ${KOMODO_DB_PASSWORD_FILE}
KOMODO_LOGGING_LEVEL: info
volumes:
## Core cache for repos for latest commit hash / contents
- ./data/repo-cache:/repo-cache
## Store sync files on server
- ./data/syncs:/syncs
## Optionally mount a custom core.config.toml
# - /path/to/core.config.toml:/config/config.toml
secrets:
- KOMODO_DB_PASSWORD
- KOMODO_PASSKEY
- KOMODO_WEBHOOK_SECRET
- KOMODO_JWT_SECRET
- KOMODO_OIDC_CLIENT_SECRET
- KOMODO_OIDC_CLIENT_ID
## Deploy Periphery container using this block,
## or deploy the Periphery binary with systemd using
## https://github.com/mbecker20/komodo/tree/main/scripts
periphery:
image: ghcr.io/mbecker20/periphery:${COMPOSE_KOMODO_IMAGE_TAG:-latest}
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
logging:
driver: ${COMPOSE_LOGGING_DRIVER:-local}
networks:
- default
env_file: ./.env
environment:
PERIPHERY_REPO_DIR: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/repos
PERIPHERY_STACK_DIR: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/stacks
PERIPHERY_SSL_KEY_FILE: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/ssl/key.pem
PERIPHERY_SSL_CERT_FILE: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/ssl/cert.pem
volumes:
## Mount external docker socket
- /var/run/docker.sock:/var/run/docker.sock
## Allow Periphery to see processes outside of container
- /proc:/proc
## Specify the Periphery agent root directory.
## Must be the same inside and outside the container,
## or docker will get confused. See https://github.com/mbecker20/komodo/discussions/180.
## Default: /etc/komodo.
- ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}:${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}
secrets:
- KOMODO_PASSKEY
networks:
default: {}
proxy-net:
external: true
secrets:
KOMODO_DB_PASSWORD:
file: ./secrets/KOMODO_DB_PASSWORD
KOMODO_PASSKEY:
file: ./secrets/KOMODO_PASSKEY
KOMODO_WEBHOOK_SECRET:
file: ./secrets/KOMODO_WEBHOOK_SECRET
KOMODO_JWT_SECRET:
file: ./secrets/KOMODO_JWT_SECRET
KOMODO_OIDC_CLIENT_SECRET:
file: ./secrets/KOMODO_OIDC_CLIENT_SECRET
KOMODO_OIDC_CLIENT_ID:
file: ./secrets/KOMODO_OIDC_CLIENT_ID

0
media-dude/.env Normal file
View File

View File

View File

@@ -0,0 +1,74 @@
services:
transmission:
image: lscr.io/linuxserver/transmission:latest
environment:
DOCKER_MODS: linuxserver/mods:transmission-env-var-settings
PUID: 998 # media user
PGID: 998 # media group
UMASK: "002"
TZ: America/Los_Angeles
TRANSMISSION_DOWNLOAD_DIR: ${TORRENTARR_DOWNLOAD_DIR:?error}/complete
TRANSMISSION_INCOMPLETE_DIR: ${TORRENTARR_DOWNLOAD_DIR:?error}/incomplete
TRANSMISSION_SPEED_LIMIT_UP: "3750"
TRANSMISSION_SPEED_LIMIT_UP_ENABLED: "true"
TRANSMISSION_WATCH_DIR_ENABLED: "false"
TRANSMISSION_RPC_PORT: ${TORRENTARR_TRANSMISSION_RPC_PORT:?error}
TRANSMISSION_RPC_AUTHENTICATION_REQUIRED: "false"
volumes:
- ./transmission_config:/config
- ${TORRENTARR_DOWNLOAD_DIR:?error}:${TORRENTARR_DOWNLOAD_DIR:?error}
network_mode: "service:gluetun"
restart: unless-stopped
depends_on:
gluetun:
condition: service_healthy
gluetun:
image: qmcgaw/gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- gluetun_forwarding:/tmp/gluetun_forwarding
ports:
- ${TORRENTARR_TRANSMISSION_RPC_PORT:?error}:${TORRENTARR_TRANSMISSION_RPC_PORT:?error}
restart: unless-stopped
environment:
VPN_SERVICE_PROVIDER: protonvpn
VPN_TYPE: wireguard
VPN_PORT_FORWARDING: on
VPN_PORT_FORWARDING_STATUS_FILE: /tmp/gluetun_forwarding/forwarded_port
PORT_FORWARD_ONLY: "on"
SERVER_COUNTRIES: United States
SERVER_CITIES: Los Angeles
UPDATER_PERIOD: 24h
secrets:
- wireguard_private_key
port-watcher:
build: ../port-watcher
volumes:
- gluetun_forwarding:/watch
environment:
PORT_FILE: /watch/forwarded_port
TRANSMISSION_HOST: gluetun
TRANSMISSION_PORT: ${TORRENTARR_TRANSMISSION_RPC_PORT:?error}
restart: unless-stopped
healthcheck:
test: ["CMD", "test", "-f", "/watch/forwarded_port"]
interval: 10s
timeout: 60s
retries: 10
start_period: 10s
depends_on:
transmission:
condition: service_started
gluetun:
condition: service_healthy
volumes:
gluetun_forwarding:
secrets:
wireguard_private_key:
file: ./secrets/wireguard_private_key

View File

@@ -0,0 +1,4 @@
COMPOSE_FILE=compose.yml:../compose.torrentarr.yml
TORRENTARR_DOWNLOAD_DIR=/media/movies/torrents
TORRENTARR_TRANSMISSION_RPC_PORT=10011
COMPOSE_BAKE=true

View File

@@ -0,0 +1,15 @@
name: torrentarr-movies
services:
radarr:
image: ghcr.io/hotio/radarr
restart: unless-stopped
ports:
- "7878:7878"
environment:
PUID: 998
PGID: 998
UMASK: "002"
TZ: America/Los_Angeles
volumes:
- ./radarr_config:/config
- /media/movies/library:/media/movies/library

View File

@@ -0,0 +1,8 @@
FROM python:3.11-alpine
WORKDIR /app
COPY port-watcher.py .
RUN pip install watchdog transmission-rpc
CMD ["python", "port-watcher.py"]

View File

@@ -0,0 +1,82 @@
#!/usr/bin/env python3
import os
import time
import logging
from transmission_rpc import Client
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
logger = logging.getLogger()
PORT_FILE = os.getenv('PORT_FILE', '/watch/forwarded_port')
TRANSMISSION_HOST = os.getenv('TRANSMISSION_HOST', 'gluetun')
TRANSMISSION_PORT = os.getenv('TRANSMISSION_PORT', 9091)
class PortFileHandler(FileSystemEventHandler):
def __init__(self):
self.last_port = None
self.transmission_client = Client(host=TRANSMISSION_HOST, port=TRANSMISSION_PORT)
self.check_port_file() # Initial check
def on_modified(self, event):
if not event.is_directory and event.src_path == PORT_FILE:
self.check_port_file()
def check_port_file(self):
try:
if not os.path.exists(PORT_FILE):
logger.info(f"Port file not found: {PORT_FILE}")
return
with open(PORT_FILE, 'r') as f:
port = f.read().strip()
if port != self.last_port and port.isdigit():
self.last_port = port
logger.info(f"Port forwarding changed to: {port}")
self.update_transmission(port)
except Exception as e:
logger.error(f"Error checking port file: {e}")
def update_transmission(self, port):
max_attempts = 5
attempt = 1
delay = 5 # seconds between retry attempts
while attempt <= max_attempts:
logger.info(f"Attempt {attempt}/{max_attempts}: Setting Transmission peer_port to {port}")
try:
self.transmission_client.set_session(peer_port=int(port))
logger.info(f"Successfully updated Transmission peer_port to {port}")
logger.info(f"Testing Transmission peer port...")
if self.transmission_client.port_test():
logger.info("Transmission peer port is open")
else:
logger.warning("Transmission peer port does not appear to be open")
return
except Exception as e:
logger.warning(f"Attempt {attempt}/{max_attempts} failed: {e}")
if attempt < max_attempts:
logger.info(f"Retrying in {delay} seconds...")
time.sleep(delay)
attempt += 1
logger.error(f"Failed to update Transmission peer_port after {max_attempts} attempts")
if __name__ == "__main__":
path = os.path.dirname(PORT_FILE)
logger.info(f"Starting port-watcher monitoring {PORT_FILE}")
event_handler = PortFileHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()

View File

@@ -0,0 +1,4 @@
COMPOSE_FILE=compose.yml:../compose.torrentarr.yml
TORRENTARR_DOWNLOAD_DIR=/media/tv/torrents
TORRENTARR_TRANSMISSION_RPC_PORT=10010
COMPOSE_BAKE=true

View File

@@ -0,0 +1,15 @@
name: torrentarr-tv
services:
sonarr:
image: ghcr.io/hotio/sonarr
restart: unless-stopped
ports:
- "8989:8989"
environment:
PUID: 998
PGID: 998
UMASK: "002"
TZ: America/Los_Angeles
volumes:
- ./sonarr_config:/config
- /media/tv/library:/media/tv/library

View File

@@ -33,21 +33,21 @@
"name": "4k Movies",
"enabled": true,
"type": "movie",
"lastScan": 1736797500041
"lastScan": 1741801200034
},
{
"id": "2",
"name": "Movies",
"enabled": true,
"type": "movie",
"lastScan": 1736797500057
"lastScan": 1741801200054
},
{
"id": "1",
"name": "TV Shows",
"enabled": true,
"type": "show",
"lastScan": 1736797500105
"lastScan": 1741801200272
}
],
"machineId": "5e16f8ceb511bde943f92bbe07e3e6e33307eb16"

89
scripts/torrentarr.sh Executable file
View File

@@ -0,0 +1,89 @@
#!/bin/bash
# Define available options as a simple array
OPTIONS=("tv" "movies" "all")
# Default values
TARGET_ALL=true
INSTANCE="all"
ACTION="up"
# Parse command line arguments
while [[ "$#" -gt 0 ]]; do
case $1 in
--down|-d)
ACTION="down"
;;
--restart|-r)
ACTION="restart"
;;
*)
# Assume this is the instance name
INSTANCE="$1"
# Only set TARGET_ALL to false if a specific instance is provided
if [ "$INSTANCE" != "all" ]; then
TARGET_ALL=false
fi
;;
esac
shift
done
# Validate the instance name
if ! [[ " ${OPTIONS[*]} " == *" ${INSTANCE} "* ]]; then
echo "Unknown instance: $INSTANCE"
echo "Valid options: ${OPTIONS[*]}"
exit 1
fi
# Function to execute docker compose commands
run_docker_compose() {
local instance=$1
local action=$2
local ENV_FILE="./${instance}.env"
if [ "$action" == "restart" ]; then
echo "Restart: Stopping $instance torrentarr instance..."
docker compose --env-file "$ENV_FILE" down --remove-orphans
echo "Restart: Starting $instance torrentarr instance..."
docker compose --env-file "$ENV_FILE" up -d
else
if [ "$action" == "down" ]; then
echo "Stopping $inst torrentarr instance..."
docker compose --env-file "$ENV_FILE" down --remove-orphans
echo "Stopped $inst torrentarr instance."
elif [ "$action" == "up" ]; then
echo "Starting $inst torrentarr instance..."
docker compose --env-file "$ENV_FILE" up -d
echo "Started $inst torrentarr instance."
fi
fi
}
# Handle all instances or specific instance
if [ "$TARGET_ALL" = true ]; then
if [ "$ACTION" == "up" ]; then
echo "Starting all instances..."
elif [ "$ACTION" == "down" ]; then
echo "Stopping all instances..."
elif [ "$ACTION" == "restart" ]; then
echo "Restarting all instances..."
fi
# Loop through all options except "all"
for inst in "${OPTIONS[@]}"; do
if [ "$inst" != "all" ]; then
run_docker_compose "$inst" $ACTION
fi
done
if [ "$ACTION" == "up" ]; then
echo "Started all instances"
elif [ "$ACTION" == "down" ]; then
echo "Stopped all instances"
elif [ "$ACTION" == "restart" ]; then
echo "Restarted all instances"
fi
else
run_docker_compose "$INSTANCE" $ACTION
fi

3
seedsync/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
config/**/*.persist
config/**/*.bak
config/**/*.backup

View File

@@ -0,0 +1,35 @@
[General]
debug = False
verbose = False
[Lftp]
remote_address = asia.feralhosting.com
remote_username = tinyturtle
remote_password = password
remote_port = 22
remote_path = /media/dmg/tinyturtle/junk_transfer
local_path = /downloads
remote_path_to_scan_script = /media/dmg/tinyturtle/.seedsync_junk_bin
use_ssh_key = True
num_max_parallel_downloads = 1
num_max_parallel_files_per_download = 2
num_max_connections_per_root_file = 5
num_max_connections_per_dir_file = 5
num_max_total_connections = 5
use_temp_file = True
[Controller]
interval_ms_remote_scan = 30000
interval_ms_local_scan = 10000
interval_ms_downloading_scan = 1000
extract_path = /seedsynctmp
use_local_path_as_extract_path = True
[Web]
port = 8802
[AutoQueue]
enabled = True
patterns_only = False
auto_extract = True

View File

@@ -0,0 +1,35 @@
[General]
debug = False
verbose = False
[Lftp]
remote_address = asia.feralhosting.com
remote_username = tinyturtle
remote_password = password
remote_port = 22
remote_path = /media/dmg/tinyturtle/junk_transfer_movies
local_path = /downloads
remote_path_to_scan_script = /media/dmg/tinyturtle/.seedsync_junk_movies_bin
use_ssh_key = True
num_max_parallel_downloads = 1
num_max_parallel_files_per_download = 2
num_max_connections_per_root_file = 5
num_max_connections_per_dir_file = 5
num_max_total_connections = 5
use_temp_file = True
[Controller]
interval_ms_remote_scan = 30000
interval_ms_local_scan = 10000
interval_ms_downloading_scan = 1000
extract_path = /seedsynctmp
use_local_path_as_extract_path = True
[Web]
port = 8805
[AutoQueue]
enabled = True
patterns_only = False
auto_extract = True

View File

@@ -0,0 +1,35 @@
[General]
debug = False
verbose = False
[Lftp]
remote_address = asia.feralhosting.com
remote_username = tinyturtle
remote_password = password
remote_port = 22
remote_path = /media/dmg/tinyturtle/junk_transfer_packs
local_path = /downloads
remote_path_to_scan_script = /media/dmg/tinyturtle/.seedsync_junk_packs_bin
use_ssh_key = True
num_max_parallel_downloads = 1
num_max_parallel_files_per_download = 2
num_max_connections_per_root_file = 5
num_max_connections_per_dir_file = 5
num_max_total_connections = 5
use_temp_file = True
[Controller]
interval_ms_remote_scan = 30000
interval_ms_local_scan = 10000
interval_ms_downloading_scan = 1000
extract_path = /seedsynctmp
use_local_path_as_extract_path = True
[Web]
port = 8804
[AutoQueue]
enabled = True
patterns_only = False
auto_extract = True

View File

@@ -0,0 +1,35 @@
[General]
debug = False
verbose = False
[Lftp]
remote_address = asia.feralhosting.com
remote_username = tinyturtle
remote_password = password
remote_port = 22
remote_path = /media/dmg/tinyturtle/transfer/movies
local_path = /downloads
remote_path_to_scan_script = /media/dmg/tinyturtle/.seedsync_movies_bin
use_ssh_key = True
num_max_parallel_downloads = 1
num_max_parallel_files_per_download = 1
num_max_connections_per_root_file = 6
num_max_connections_per_dir_file = 6
num_max_total_connections = 6
use_temp_file = True
[Controller]
interval_ms_remote_scan = 30000
interval_ms_local_scan = 10000
interval_ms_downloading_scan = 1000
extract_path = /seedsynctmp
use_local_path_as_extract_path = True
[Web]
port = 8801
[AutoQueue]
enabled = True
patterns_only = False
auto_extract = True

View File

@@ -0,0 +1,35 @@
[General]
debug = False
verbose = False
[Lftp]
remote_address = asia.feralhosting.com
remote_username = tinyturtle
remote_password = password
remote_port = 22
remote_path = /media/dmg/tinyturtle/transfer/other
local_path = /downloads
remote_path_to_scan_script = /media/dmg/tinyturtle/.seedsync_other_bin
use_ssh_key = True
num_max_parallel_downloads = 1
num_max_parallel_files_per_download = 2
num_max_connections_per_root_file = 4
num_max_connections_per_dir_file = 4
num_max_total_connections = 4
use_temp_file = True
[Controller]
interval_ms_remote_scan = 30000
interval_ms_local_scan = 10000
interval_ms_downloading_scan = 1000
extract_path = /seedsynctmp
use_local_path_as_extract_path = True
[Web]
port = 8803
[AutoQueue]
enabled = True
patterns_only = False
auto_extract = False

View File

@@ -0,0 +1,35 @@
[General]
debug = False
verbose = False
[Lftp]
remote_address = asia.feralhosting.com
remote_username = tinyturtle
remote_password = password
remote_port = 22
remote_path = /media/dmg/tinyturtle/transfer/tv
local_path = /downloads
remote_path_to_scan_script = /media/dmg/tinyturtle/.seedsync_tv_bin
use_ssh_key = True
num_max_parallel_downloads = 1
num_max_parallel_files_per_download = 2
num_max_connections_per_root_file = 4
num_max_connections_per_dir_file = 4
num_max_total_connections = 4
use_temp_file = True
[Controller]
interval_ms_remote_scan = 30000
interval_ms_local_scan = 10000
interval_ms_downloading_scan = 1000
extract_path = /seedsynctmp
use_local_path_as_extract_path = True
[Web]
port = 8800
[AutoQueue]
enabled = True
patterns_only = False
auto_extract = True

View File

@@ -0,0 +1,68 @@
name: seedsync
services:
junksync:
image: ipsingh06/seedsync:latest
container_name: junksync
user: '998'
ports:
- 8802:8802
volumes:
- /media/junk/new_transfer:/downloads
- ./config/seedsync_junk:/config
- /home/media/.ssh:/home/seedsync/.ssh
restart: unless-stopped
junkpacksync:
image: ipsingh06/seedsync:latest
container_name: junkpacksync
user: '998'
ports:
- 8804:8804
volumes:
- /media/raid/junk_pack_transfer:/downloads
- ./config/seedsync_junk_packs:/config
- /home/media/.ssh:/home/seedsync/.ssh
restart: unless-stopped
junkmoviesync:
image: ipsingh06/seedsync:latest
container_name: junkmoviesync
user: '998'
ports:
- 8805:8805
volumes:
- /media/raid/junk_movies_transfer:/downloads
- ./config/seedsync_junk_movies:/config
- /home/media/.ssh:/home/seedsync/.ssh
restart: unless-stopped
moviesync:
image: ipsingh06/seedsync:latest
container_name: moviesync
user: '998'
ports:
- 8801:8801
volumes:
- /media/downloads/movies:/downloads
- ./config/seedsync_movies:/config
- /home/media/.ssh:/home/seedsync/.ssh
restart: unless-stopped
tvsync:
image: ipsingh06/seedsync:latest
container_name: tvsync
user: '998'
ports:
- 8800:8800
volumes:
- /media/downloads/tv:/downloads
- ./config/seedsync_tv:/config
- /home/media/.ssh:/home/seedsync/.ssh
restart: unless-stopped
othersync:
image: ipsingh06/seedsync:latest
container_name: othersync
user: '998'
ports:
- 8803:8803
volumes:
- /media/downloads/other:/downloads
- ./config/seedsync_other:/config
- /home/media/.ssh:/home/seedsync/.ssh
restart: unless-stopped

View File

@@ -5,7 +5,9 @@ calculate_md5: false
continue_playlist_default: true
create_image_clip_from_videos: false
cssenabled: false
dangerous_allow_public_without_auth: "false"
custom_served_folders:
/: /custom_web
dangerous_allow_public_without_auth: true
database: /db/stash-go.sqlite
defaults:
auto_tag_task:
@@ -103,11 +105,13 @@ no_proxy: localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
nobrowser: true
notifications_enabled: false
parallel_tasks: 0
password: $2a$04$T8nN490lPHZw1rf6v1Q2ze/VAn3hhgiJ6l/SSV96gBMwhmDLk/dXq
plugins:
disabled:
- VideoScrollWheel
- TPDBMarkers
- filemonitor
- markerTagToScene
- visage
package_sources:
- localpath: community
name: Community (stable)
@@ -115,22 +119,68 @@ plugins:
- localpath: stash-plugins
name: Stash-Plugins
url: https://7djx1qp.github.io/stash-plugins/main/index.yml
- localpath: tetrax
name: Tetrax
url: https://tetrax-10.github.io/stash-stuffs/index.yml
- localpath: valkyr
name: Valkyr
url: https://valkyr-js.github.io/stash-plugins/index.yml
- localpath: stgannon
name: STG Annon
url: https://stg-annon.github.io/StashScripts/stable/index.yml
- localpath: community
name: Axter-Stash
url: https://stash.axter.com/Dev/index.yml
settings:
DupFileManager:
matchDupDistance: "1"
mergeDupFilename: true
zwGraylist: /data,/movies,/packs
zxBlacklist: ""
zySwapBetterBitRate: true
zySwapBetterFrameRate: false
zySwapCodec: true
zySwapHighRes: true
zySwapLongLength: true
zzDebug: true
zzObsoleteSettingsCheckVer2: true
zzTracing: true
zzdryRun: false
PerformerDetailsExtended:
additionalStyling: false
appearsMostWithGendered: true
scenesTimespanReverse: false
showWhenCollapsed: true
topTagsOn: true
totalPlayCountOn: true
cjCardTweaks:
addBannerDimension: true
fileCount: true
performerProfileCards: true
markerTagToScene:
allTags: false
stashStashIDInput:
performers: true
studios: true
stashStashIdInput:
performers: true
studios: true
tPdBmarkers:
disableSceneMarkerHook: true
tagGraph:
options: true
timestampTrade:
createMovieFromScene: false
addTimestampTradeUrl: true
addTsTradeTag: true
createGalleryFromScene: false
createMarkers: true
createMovieFromScene: true
disableGalleryLookupHook: true
disableSceneMarkersHook: false
extraUrls: false
extraUrls: true
matchFunscripts: false
mergeMarkers: true
overwriteMarkers: false
plugins_path: /plugins/
port: 9999
preview_audio: true
@@ -174,6 +224,9 @@ stash_boxes:
- apikey: H04DEzLXkMqUBtNdS9CYOI4ek9KZb0EBSfNhTt1A87ee11b2
endpoint: https://theporndb.net/graphql
name: ThePornDB
- apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiIwNWY4OTFiYy04MjVlLTQ1ZmQtYWFkYS0yYTc0OWE2NzgzMWQiLCJzdWIiOiJBUElLZXkiLCJpYXQiOjE3Mzk2MDkxOTF9.fMPLqqt2B3iw1qpOjMVMHmqMcorbw42Jy4WIBkyj7wo
endpoint: https://fansdb.cc/graphql
name: FansDB
theme_color: '#202b33'
ui:
advancedMode: true
@@ -298,631 +351,11 @@ ui:
excludedStudioFields:
- name
fingerprintQueue:
https://stashdb.org/graphql:
- "14115"
- "13320"
- "13623"
- "17433"
- "14152"
- "14206"
- "14168"
- "17294"
- "13905"
- "13385"
- "13837"
- "16837"
- "16596"
- "16686"
- "13382"
- "15576"
- "16643"
- "12278"
- "16976"
- "16406"
- "14106"
- "12610"
- "17452"
- "17174"
- "12615"
- "13066"
- "12532"
- "17526"
- "17402"
- "17170"
- "17273"
- "16997"
- "17525"
- "12403"
- "15519"
- "17428"
- "16421"
- "14631"
- "17523"
- "17287"
- "17528"
- "15901"
- "17398"
- "16135"
- "13178"
- "17282"
- "17724"
- "17727"
- "17729"
- "17709"
- "17728"
- "17737"
- "17713"
- "17726"
- "17750"
- "17748"
- "17742"
- "17747"
- "17754"
- "17719"
- "17751"
- "17714"
- "17721"
- "17712"
- "17711"
- "17739"
- "17753"
- "17710"
- "17752"
- "17741"
- "17734"
- "17720"
- "17723"
- "17707"
- "17725"
- "17746"
- "17755"
- "17757"
- "17749"
- "17730"
- "17717"
- "17756"
- "17731"
- "17716"
- "17740"
- "17733"
- "17735"
- "17758"
- "17708"
- "17718"
- "17743"
- "17745"
- "17786"
- "17878"
- "17817"
- "17814"
- "17813"
- "17815"
- "17865"
- "17893"
- "17812"
- "17792"
- "17818"
- "17819"
- "17826"
- "17787"
- "17797"
- "17804"
- "17799"
- "17795"
- "17798"
- "17828"
- "17802"
- "17805"
- "17827"
- "17831"
- "17832"
- "17839"
- "17883"
- "17845"
- "17842"
- "17810"
- "17807"
- "17844"
- "17785"
- "17822"
- "17808"
- "17811"
- "17823"
- "17816"
- "17837"
- "17836"
- "17825"
- "17833"
- "17838"
- "17830"
- "17889"
- "17891"
- "17806"
- "17770"
- "17801"
- "17843"
- "17835"
- "17809"
- "17790"
- "17796"
- "17789"
- "17820"
- "17896"
- "17867"
- "17908"
- "17909"
- "17912"
- "17886"
- "17885"
- "17794"
- "17803"
- "17821"
- "17793"
- "17784"
- "17890"
- "17834"
- "17850"
- "17800"
- "17848"
- "17841"
- "17849"
- "17846"
- "17852"
- "17824"
- "17851"
- "17961"
- "17875"
- "17880"
- "17870"
- "17856"
- "17895"
- "17897"
- "17858"
- "17854"
- "17855"
- "17860"
- "17861"
- "17859"
- "17864"
- "17857"
- "17862"
- "17863"
- "17906"
- "17927"
- "17894"
- "17911"
- "17905"
- "17873"
- "17918"
- "17892"
- "17888"
- "17916"
- "17881"
- "17920"
- "17884"
- "17930"
- "17921"
- "17915"
- "17922"
- "17928"
- "17924"
- "17874"
- "17877"
- "17879"
- "17871"
- "17869"
- "17926"
- "17876"
- "17882"
- "17917"
- "17872"
- "17868"
- "17913"
- "17903"
- "17919"
- "17914"
- "17904"
- "17933"
- "17934"
- "17932"
- "17887"
- "17866"
- "17929"
- "17923"
- "17910"
- "17925"
- "17902"
- "17931"
- "17898"
- "17901"
- "17900"
- "17899"
- "17907"
- "17935"
- "17939"
- "17937"
- "17936"
- "17938"
- "17943"
- "17947"
- "17940"
- "17955"
- "17952"
- "17948"
- "17946"
- "17941"
- "17951"
- "17942"
- "17944"
- "17953"
- "17949"
- "17945"
- "17954"
- "17983"
- "17987"
- "17968"
- "17960"
- "17959"
- "17988"
- "17972"
- "17965"
- "17984"
- "17986"
- "17967"
- "17976"
- "17962"
- "17978"
- "17977"
- "17970"
- "17969"
- "17985"
- "17991"
- "17980"
- "17975"
- "17974"
- "17964"
- "17981"
- "17957"
- "17993"
- "17989"
- "17973"
- "17958"
- "17963"
- "17966"
- "17971"
- "17990"
- "17979"
- "18003"
- "18001"
- "17995"
- "18002"
- "17994"
- "18000"
- "17997"
- "17996"
- "17999"
- "17998"
- "18004"
- "18005"
- "18009"
- "18008"
- "18012"
- "18010"
- "18007"
- "18013"
- "18006"
- "18011"
- "18207"
- "18215"
- "18217"
- "18187"
- "18190"
- "18196"
- "18191"
- "18194"
- "18227"
- "18188"
- "18281"
- "18192"
- "18189"
- "18204"
- "18246"
- "18245"
- "18208"
- "18209"
- "18199"
- "18232"
- "18213"
- "18019"
- "18014"
- "18015"
- "18016"
- "18017"
- "18018"
- "18020"
- "18249"
- "18219"
- "18229"
- "18221"
- "18233"
- "18220"
- "18198"
- "18195"
- "18212"
- "18211"
- "18239"
- "18223"
- "18203"
- "18222"
- "18226"
- "18210"
- "18225"
- "18218"
- "18224"
- "18214"
- "18231"
- "18238"
- "18243"
- "18216"
- "18202"
- "18240"
- "18205"
- "18197"
- "18242"
- "18201"
- "18241"
- "18228"
- "18200"
- "18230"
- "18193"
- "18234"
- "18237"
- "18278"
- "18279"
- "18359"
- "18303"
- "18305"
- "18297"
- "18283"
- "18275"
- "18285"
- "18298"
- "18252"
- "18250"
- "18247"
- "18206"
- "18253"
- "18254"
- "18244"
- "18236"
- "18251"
- "18248"
- "18259"
- "18256"
- "18257"
- "18258"
- "18261"
- "18260"
- "18255"
- "18267"
- "18265"
- "18264"
- "18263"
- "18266"
- "18268"
- "18262"
- "18315"
- "18294"
- "18309"
- "18314"
- "18274"
- "18288"
- "18277"
- "18273"
- "18282"
- "18329"
- "18312"
- "18308"
- "18311"
- "18287"
- "18327"
- "18307"
- "18291"
- "18271"
- "18269"
- "18295"
- "18270"
- "18272"
- "18276"
- "18290"
- "18299"
- "18331"
- "18332"
- "18328"
- "18306"
- "18280"
- "18317"
- "18304"
- "18333"
- "18300"
- "18336"
- "18296"
- "18339"
- "18326"
- "18310"
- "18292"
- "18322"
- "18323"
- "18343"
- "18313"
- "18293"
- "18286"
- "18284"
- "18337"
- "18338"
- "18334"
- "18330"
- "18335"
- "18352"
- "18372"
- "18402"
- "18347"
- "18348"
- "18396"
- "18382"
- "18384"
- "18357"
- "18405"
- "18409"
- "18371"
- "18389"
- "18374"
- "18392"
- "18388"
- "18367"
- "18404"
- "18380"
- "18361"
- "18383"
- "18391"
- "18398"
- "18350"
- "18373"
- "18408"
- "18400"
- "18377"
- "18379"
- "18403"
- "18354"
- "18362"
- "18394"
- "18410"
- "18458"
- "18459"
- "18460"
- "18455"
- "18457"
- "18456"
- "18454"
- "18453"
- "18452"
- "18451"
- "18450"
- "18448"
- "18449"
- "18447"
- "18446"
- "18445"
- "18442"
- "18444"
- "18443"
- "18441"
- "18438"
- "18439"
- "18437"
- "18436"
- "18435"
- "18434"
- "18433"
- "18432"
- "18430"
- "18431"
- "18428"
- "18429"
- "18427"
- "18426"
- "18425"
- "18423"
- "18424"
- "18422"
- "18421"
- "18420"
- "18419"
- "18418"
- "18417"
- "18416"
- "18415"
- "18413"
- "18411"
- "18412"
- "18414"
- "18461"
- "18462"
- "18463"
- "18465"
- "18466"
- "18469"
- "18468"
- "18472"
- "18471"
- "18473"
- "18474"
- "18477"
- "18476"
- "18478"
- "18479"
- "18480"
- "18481"
- "18482"
- "18483"
- "18484"
- "18485"
- "18487"
- "18488"
- "18489"
- "18490"
- "18491"
- "18493"
- "18492"
- "18495"
- "18494"
- "18497"
- "18496"
- "18498"
- "18499"
- "18501"
- "18503"
- "18502"
- "18504"
- "18505"
- "18507"
- "18506"
- "18512"
- "18486"
- "18517"
- "18534"
- "18532"
- "18535"
- "18533"
- "18537"
- "18536"
- "18539"
- "18540"
- "18541"
- "18543"
- "18544"
- "18545"
- "18546"
- "18547"
- "18550"
- "18552"
- "18554"
- "18556"
- "18555"
- "18557"
- "18559"
- "18560"
- "18551"
- "18558"
https://theporndb.net/graphql:
- "18500"
- "18538"
- "18542"
- "18549"
- "18553"
https://stashdb.org/graphql: []
https://theporndb.net/graphql: []
markSceneAsOrganizedOnSave: false
mode: auto
selectedEndpoint: https://stashdb.org/graphql
selectedEndpoint: https://theporndb.net/graphql
setCoverImage: true
setTags: true
showMales: true
@@ -931,7 +364,7 @@ ui:
cleanGenerated:
blobFiles: true
dryRun: false
imageThumbnails: false
imageThumbnails: true
markers: true
screenshots: true
sprites: true
@@ -944,7 +377,7 @@ ui:
interactiveHeatmapsSpeeds: false
markerImagePreviews: false
markerScreenshots: false
markers: false
markers: true
phashes: true
previewOptions:
previewExcludeEnd: "0"

View File

@@ -8,22 +8,14 @@ services:
## the container's port must be the same with the STASH_PORT in the environment section
networks:
- proxy-net
ports:
- "9999:9999"
expose:
- "9999"
## If you intend to use stash's DLNA functionality uncomment the below network mode and comment out the above ports section
# network_mode: host
logging:
driver: "json-file"
options:
max-file: "10"
max-size: "2m"
environment:
- STASH_STASH=/data/
- STASH_GENERATED=/generated/
- STASH_METADATA=/metadata/
- STASH_CACHE=/cache/
- STASH_EXTERNAL_HOST=https://stash.tremendousturtle.tools
## Adjust below to change default port (9999)
- STASH_PORT=9999
volumes:
@@ -35,6 +27,7 @@ services:
- ./config:/root/.stash
## Point this at your collection.
- /media/raid/junk_transfer:/data
- /media/junk/new_transfer:/data/new_transfer
- /media/raid/stash:/stash
- /media/junk/junk:/junk
- /media/raid/junk_movies_transfer:/movies
@@ -51,6 +44,13 @@ services:
- ./data/scrapers:/scrapers
## Where to store database file
- ./data/db:/db
## Custom DupFileManager plugin
- /code/Axter-Stash-Gitea/plugins/DupFileManager:/plugins/community/DupFileManager
- /code/Axter-Stash-Gitea/plugins/DupFileManager/web:/custom_web
## Custom TimestampTrade plugin
- /code/Stash-CommunityScripts/plugins/timestampTrade:/plugins/timestampTrade
## Custom RemoveMarkers plugin
- /code/Stash-Plugins/RemoveMarkers:/plugins/RemoveMarkers
## Where to store generated content (screenshots,previews,transcodes,sprites)
- /media/stashapp/generated:/generated

8
tautulli/.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
config/backups/
config/cache/
config/exports/
config/logs/
config/newsletters/
config/release.lock
config/tautulli.db
config/version.lock

170
tautulli/config/config.ini Normal file
View File

@@ -0,0 +1,170 @@
[General]
allow_guest_access = 0
date_format = YYYY-MM-DD
time_format = HH:mm
anon_redirect = https://www.nullrefer.com/?
anon_redirect_dynamic = 0
api_enabled = 1
api_key = 079935546d82416db237001d03059dc3
api_sql = 0
backup_days = 3
backup_dir = /config/backups
backup_interval = 6
cache_dir = /config/cache
cache_images = 1
check_github = 1
check_github_interval = 6
check_github_on_startup = 1
cleanup_files = 0
do_not_override_git_branch = 0
enable_https = 0
export_dir = /config/exports
first_run_complete = 1
freeze_db = 0
get_file_sizes = 0
git_branch = master
git_path = ""
git_remote = origin
git_token = ""
git_user = Tautulli
git_repo = Tautulli
group_history_tables = 1
history_table_activity = 1
home_sections = current_activity, watch_stats, library_stats, recently_added
home_library_cards = 4, 2, 1, 5, 7, 8, 9, 12
home_stats_cards = top_movies, popular_movies, top_tv, popular_tv, top_music, popular_music, last_watched, top_libraries, top_users, top_platforms, most_concurrent
home_refresh_interval = 10
https_create_cert = 1
https_cert = /config/server.crt
https_cert_chain = ""
https_key = /config/server.key
https_domain = localhost
https_ip = 127.0.0.1
http_basic_auth = 0
http_environment = production
http_hash_password = 1
http_hashed_password = 1
http_host = 0.0.0.0
http_password = PBKDF2$sha256$600000$Y6kl7oc/cNUwRhxpN3cYDw==$b4hYGhFatQNKuNvFsY4IEFI5FHVZjBKY
http_port = 8181
http_proxy = 0
http_root = ""
http_username = chris
http_plex_admin = 1
http_base_url = ""
http_rate_limit_attempts = 10
http_rate_limit_attempts_interval = 300
http_rate_limit_lockout_time = 300
http_thread_pool = 10
interface = default
launch_browser = 0
launch_startup = 0
log_blacklist = 1
log_blacklist_usernames = 1
log_dir = /config/logs
musicbrainz_lookup = 0
plexpy_auto_update = 0
show_advanced_settings = 1
themoviedb_apikey = e9a6655bae34bf694a0f3e33338dc28e
themoviedb_lookup = 0
tvmaze_lookup = 0
update_db_interval = 24
update_show_changelog = 0
week_start_monday = 0
sys_tray_icon = 0
[[get_file_sizes_hold]]
section_ids = ,
rating_keys = ,
[PMS]
pms_client_id = a63eebdc-9a0e-45be-9448-d8769535c470
pms_identifier = 5e16f8ceb511bde943f92bbe07e3e6e33307eb16
pms_ip = 192.168.1.234
pms_is_cloud = 0
pms_is_remote = 0
pms_language = ""
pms_logs_folder = /plex_logs
pms_logs_line_cap = 1000
pms_name = winterfell
pms_name_override = ""
pms_port = 32400
pms_token = udTzPteNY8SNSibrzajX
pms_ssl = 0
pms_url = http://192.168.1.234:32400
pms_url_override = ""
pms_url_manual = 0
pms_use_bif = 0
pms_uuid = db661b1c35ed453bba7ddee2e44e3145
pms_plexpass = 1
pms_platform = Linux
pms_version = 1.41.4.9463-630c9f557
pms_update_channel = plex
pms_update_distro = debian
pms_update_distro_build = linux-x86
pms_web_url = https://app.plex.tv/desktop
[Advanced]
pms_timeout = 15
pms_update_check_interval = 24
cache_sizemb = 32
check_docker_mount = 1
check_github_cache_seconds = 3600
config_version = 22
export_threads = 8
https_min_tls_version = TLSv1.2
journal_mode = WAL
metadata_cache_seconds = 1800
notification_threads = 2
notify_text_eval = 0
session_db_write_attempts = 5
synchronous_mode = NORMAL
upgrade_flag = 1
verbose_logs = 1
verify_ssl_cert = 1
websocket_monitor_ping_pong = 0
websocket_connection_attempts = 5
websocket_connection_timeout = 5
jwt_secret = 11a7ffcc84ad42c98cf603d50cffdde5
jwt_update_secret = 0
system_analytics = 1
[Monitoring]
buffer_threshold = 10
buffer_wait = 900
imgur_client_id = ""
logging_ignore_interval = 60
movie_watched_percent = 85
music_watched_percent = 85
monitor_pms_updates = 0
monitoring_interval = 60
notify_consecutive = 0
notify_continued_session_threshold = 15
notify_group_recently_added_grandparent = 1
notify_group_recently_added_parent = 1
notify_upload_posters = 0
notify_recently_added_delay = 300
notify_recently_added_grandparent = 0
notify_recently_added_upgrade = 0
notify_remote_access_threshold = 60
notify_concurrent_by_ip = 0
notify_concurrent_ipv6_cidr = /64
notify_concurrent_threshold = 2
notify_new_device_initial_only = 1
notify_server_connection_threshold = 60
notify_server_update_repeat = 0
notify_plexpy_update_repeat = 0
refresh_libraries_interval = 12
refresh_libraries_on_startup = 1
refresh_users_interval = 12
refresh_users_on_startup = 1
tv_watched_percent = 85
watched_marker = 3
[Cloudinary]
cloudinary_cloud_name = ""
cloudinary_api_key = ""
cloudinary_api_secret = ""
[Newsletter]
newsletter_auth = 0
newsletter_password = ""
newsletter_custom_dir = ""
newsletter_inline_styles = 0
newsletter_templates = newsletters
newsletter_dir = /config/newsletters
newsletter_self_hosted = 0

View File

@@ -0,0 +1,18 @@
name: tautulli
services:
app:
environment:
TZ: America/Los_Angeles
image: ghcr.io/tautulli/tautulli:latest
networks:
- proxy-net
expose:
- "8181"
restart: unless-stopped
volumes:
- ./config:/config
- /var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Logs:/plex_logs:ro
networks:
proxy-net:
external: true