Initial commit

This commit is contained in:
2025-03-22 14:29:48 +01:00
commit da7781035d
87 changed files with 3160 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
services:
grampsweb:
container_name: grampsweb
image: ghcr.io/gramps-project/grampsweb:latest
restart: always
networks:
- default
- proxy
ports:
- "5000"
environment:
GRAMPSWEB_TREE: "Gramps Web" # will create a new tree if not exists
GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://grampsweb_redis:6379/0"
GRAMPSWEB_CELERY_CONFIG__result_backend: "redis://grampsweb_redis:6379/0"
GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://grampsweb_redis:6379/1
depends_on:
- grampsweb_redis
volumes:
- gramps_users:/app/users
- gramps_index:/app/indexdir
- gramps_thumb_cache:/app/thumbnail_cache
- gramps_cache:/app/cache
- gramps_secret:/app/secret
- gramps_db:/root/.gramps/grampsdb
- gramps_media:/app/media
- gramps_tmp:/tmp
labels:
- "traefik.enable=true"
- "traefik.http.routers.grampsweb.rule=Host(`gramps.local`)"
grampsweb_celery:
container_name: grampsweb_celery
image: ghcr.io/gramps-project/grampsweb:latest
restart: always
environment:
GRAMPSWEB_TREE: "Gramps Web" # will create a new tree if not exists
GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://grampsweb_redis:6379/0"
GRAMPSWEB_CELERY_CONFIG__result_backend: "redis://grampsweb_redis:6379/0"
GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://grampsweb_redis:6379/1
volumes:
- gramps_users:/app/users
- gramps_index:/app/indexdir
- gramps_thumb_cache:/app/thumbnail_cache
- gramps_cache:/app/cache
- gramps_secret:/app/secret
- gramps_db:/root/.gramps/grampsdb
- gramps_media:/app/media
- gramps_tmp:/tmp
depends_on:
- grampsweb_redis
command: celery -A gramps_webapi.celery worker --loglevel=INFO --concurrency=2
grampsweb_redis:
image: docker.io/library/redis:7.2.4-alpine
container_name: grampsweb_redis
restart: always
volumes:
gramps_users:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/gramps/users'
gramps_index:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/gramps/index'
gramps_thumb_cache:
gramps_cache:
gramps_secret:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/gramps/secret'
gramps_db:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/gramps/db'
gramps_media:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/gramps/media'
gramps_tmp:
networks:
proxy:
name: proxy
external: true

View File

@@ -0,0 +1,39 @@
services:
jackett:
container_name: jackett
image: ghcr.io/hotio/jackett
ports:
- "9117"
networks:
- default
- proxy
environment:
- PUID=1000
- PGID=1000
- UMASK=002
- TZ=Europe/Paris
volumes:
- config:/config
- definitions:/app/Definitions
labels:
- "traefik.enable=true"
- "traefik.http.routers.jackett.rule=Host(`jackett.local`)"
volumes:
config:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/jackett/config'
definitions:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/jackett/Definitions/Custom'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,58 @@
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: "1000:1000"
networks:
- default
- proxy
ports:
- "8096"
volumes:
- config:/etc/jellyfin
- data:/var/lib/jellyfin
- cache:/cache
- log:/log
- nfs_films:/films
- nfs_series:/series
restart: 'unless-stopped'
# Alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=https://flix.vhaudiquet.fr
- JELLYFIN_CONFIG_DIR=/etc/jellyfin
- JELLYFIN_DATA_DIR=/var/lib/jellyfin
- JELLYFIN_LOG_DIR=/log
- JELLYFIN_CACHE_DIR=/cache
labels:
- "traefik.enable=true"
- "traefik.http.routers.jellyfin.rule=Host(`flix.vhaudiquet.fr`)"
volumes:
nfs_films:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local,ro'
device: ':/mnt/media/films'
nfs_series:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local,ro'
device: ':/mnt/media/series'
cache:
log:
config:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/jellyfin/config'
data:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/jellyfin/data'
networks:
proxy:
name: proxy
external: true

View File

@@ -0,0 +1,32 @@
services:
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr
environment:
- LOG_LEVEL=debug
- TZ=Europe/Paris
- PORT=5055 #optional
networks:
- default
- proxy
ports:
- 5055
volumes:
- config:/app/config
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.jellyseerr.rule=Host(`jellyseerr.local`)"
volumes:
config:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/jellyseerr/config'
networks:
proxy:
name: proxy
external: true

View File

@@ -0,0 +1,44 @@
services:
radarr:
container_name: radarr
image: ghcr.io/hotio/radarr
ports:
- "7878"
networks:
- default
- proxy
environment:
- PUID=1000
- PGID=1000
- UMASK=002
- TZ=Europe/Paris
volumes:
- config:/config
- data_movies:/films
- data_downloads:/mediadl
labels:
- "traefik.enable=true"
- "traefik.http.routers.radarr.rule=Host(`radarr.local`)"
volumes:
config:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/radarr/config'
data_movies:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local'
device: ':/mnt/media/films'
data_downloads:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local'
device: ':/mnt/media/download'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,48 @@
services:
sonarr:
container_name: sonarr
image: ghcr.io/hotio/sonarr:latest
ports:
- "8989"
networks:
- default
- proxy
environment:
- PUID=1000
- PGID=1000
- UMASK=002
- TZ=Europe/Paris
volumes:
- config:/config
- data_series:/data/tv
- data_downloads:/mediadl
- cache:/cache
- log:/log
labels:
- "traefik.enable=true"
- "traefik.http.routers.sonarr.rule=Host(`sonarr.local`)"
volumes:
cache:
log:
config:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/sonarr/config'
data_series:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local'
device: ':/mnt/media/series'
data_downloads:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local'
device: ':/mnt/media/download'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,44 @@
services:
transmission:
image: lscr.io/linuxserver/transmission:latest
container_name: transmission
networks:
- default
- proxy
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
- USER=transmission
- PASS=transmission
- HOST_WHITELIST=transmission.local
volumes:
- config:/config
- downloads:/mediadl
ports:
- '9091'
- 51413:51413
- 51413:51413/udp
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.transmission.rule=Host(`transmission.local`)"
volumes:
config:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/transmission/config'
downloads:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local'
device: ':/mnt/media/download'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,27 @@
services:
wizarr:
container_name: wizarr
image: ghcr.io/wizarrrr/wizarr:latest
networks:
- default
- proxy
ports:
- 5690:5690
volumes:
- wizarr_data:/data/database
labels:
- "traefik.enable=true"
- "traefik.http.routers.wizarr.rule=Host(`wizarr.local`)"
volumes:
wizarr_data:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/wizarr/data'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,41 @@
services:
navidrome:
image: deluan/navidrome:latest
user: 1000:1000 # should be owner of volumes
ports:
- "4533"
restart: unless-stopped
networks:
- default
- proxy
environment:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: "http://navidrome.local"
ND_PORT: 4533
ND_REVERSEPROXYWHITELIST: "172.20.0.0/16,10.1.2.11/32"
volumes:
- data:/data
- "music:/music:ro"
labels:
- "traefik.enable=true"
- "traefik.http.routers.navidrome.rule=Host(`navidrome.local`)"
volumes:
music:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local,ro'
device: ':/mnt/media/music'
data:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/navidrome/data'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,94 @@
services:
tubearchivist:
container_name: tubearchivist
restart: unless-stopped
image: bbilly1/tubearchivist:v0.4.13
ports:
- "8000"
networks:
- default
- proxy
volumes:
- media:/youtube
- cache:/cache
env_file:
- .env
environment:
- ES_URL=http://archivist-es:9200
- REDIS_HOST=archivist-redis
- HOST_UID=1000
- HOST_GID=1000
- TA_HOST=tubearchivist.local
- TZ=Europe/Paris
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 2m
timeout: 10s
retries: 3
start_period: 30s
depends_on:
- archivist-es
- archivist-redis
labels:
- "traefik.enable=true"
- "traefik.http.routers.tubearchivist.rule=Host(`tubearchivist.local`)"
- "traefik.http.routers.tubearchivist.middlewares=tubearchivist-headers"
- "traefik.http.middlewares.tubearchivist-headers.headers.accesscontrolalloworiginlist=*"
- "traefik.http.middlewares.tubearchivist-headers.headers.accesscontrolallowmethods=GET,OPTIONS,PUT"
- "traefik.http.middlewares.tubearchivist-headers.headers.accesscontrolallowheaders=Authorization,*"
archivist-redis:
image: redis/redis-stack-server
container_name: archivist-redis
restart: unless-stopped
expose:
- "6379"
volumes:
- redis:/data
depends_on:
- archivist-es
archivist-es:
image: bbilly1/tubearchivist-es # only for amd64, or use official es 8.16.0
container_name: archivist-es
restart: unless-stopped
env_file:
- .env
environment:
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- "xpack.security.enabled=true"
- "discovery.type=single-node"
- "path.repo=/usr/share/elasticsearch/data/snapshot"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es:/usr/share/elasticsearch/data
expose:
- "9200"
volumes:
media:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local'
device: ':/mnt/media/youtube'
cache:
redis:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/tubearchivist/redis'
es:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/tubearchivist/es'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,86 @@
services:
pplessbroker:
image: docker.io/library/redis:7
restart: unless-stopped
volumes:
- redisdata:/data
pplessdb:
image: docker.io/library/postgres:16
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql/data
env_file:
- .env
environment:
POSTGRES_DB: paperless
paperless-webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
networks:
- default
- proxy
depends_on:
- pplessdb
- pplessbroker
ports:
- "8000"
volumes:
- data:/usr/src/paperless/data
- media:/usr/src/paperless/media
- export:/usr/src/paperless/export
- consume:/usr/src/paperless/consume
labels:
- "traefik.enable=true"
- "traefik.http.routers.paperless-webserver.rule=Host(`paperless.local`)"
env_file: .env
environment:
PAPERLESS_REDIS: redis://pplessbroker:6379
PAPERLESS_DBHOST: pplessdb
PAPERLESS_APPS: allauth.socialaccount.providers.openid_connect
PAPERLESS_ACCOUNT_DEFAULT_HTTP_PROTOCOL: http
volumes:
data:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/paperless/data'
media:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/paperless/media'
pgdata:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/paperless/db'
redisdata:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/paperless/redis'
export:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/paperless/export'
consume:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/paperless/consume'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,48 @@
services:
radicale:
image: tomsquest/docker-radicale
container_name: radicale
ports:
- 5232
init: true
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- SETUID
- SETGID
- CHOWN
- KILL
deploy:
resources:
limits:
memory: 256M
pids: 50
healthcheck:
test: curl -f http://127.0.0.1:5232 || exit 1
interval: 30s
retries: 3
restart: unless-stopped
volumes:
- data:/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.radicale.rule=Host(`radicale.local`)"
networks:
- default
- proxy
volumes:
data:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/radicale/data'
networks:
proxy:
external: true
name: proxy

View File

@@ -0,0 +1,42 @@
services:
syncthing-valentin:
image: syncthing/syncthing
container_name: syncthing-valentin
hostname: syncthing-valentin
network_mode: host
environment:
- PUID=1000
- PGID=1000
volumes:
- config:/var/syncthing/config
- valentin_documents:/valentin/Documents
- valentin_photos:/valentin/Photos
ports:
- 8384:8384 # Web UI
- 22000:22000/tcp # TCP file transfers
- 22000:22000/udp # QUIC file transfers
- 21027:21027/udp # Receive local discovery broadcasts
restart: unless-stopped
healthcheck:
test: curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1
interval: 1m
timeout: 10s
retries: 3
volumes:
config:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/syncthing-valentin/config'
valentin_documents:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local'
device: ':/mnt/main_storage/valentin/Documents'
valentin_photos:
driver_opts:
type: 'nfs'
o: 'addr=truenas.local'
device: ':/mnt/main_storage/valentin/Photos'

View File

@@ -0,0 +1,71 @@
services:
db_recipes:
restart: always
image: postgres:16-alpine
volumes:
- postgresql:/var/lib/postgresql/data
env_file:
- ./.env
web_recipes:
restart: always
image: vabene1111/recipes
env_file:
- ./.env
volumes:
- staticfiles:/opt/recipes/staticfiles
- nginx_config:/opt/recipes/nginx/conf.d
- mediafiles:/opt/recipes/mediafiles
depends_on:
- db_recipes
nginx_recipes:
image: nginx:mainline-alpine
restart: always
networks:
- default
- proxy
ports:
- 80
env_file:
- ./.env
depends_on:
- web_recipes
volumes:
- nginx_config:/etc/nginx/conf.d:ro
- staticfiles:/static:ro
- mediafiles:/media:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.nginx_recipes.rule=Host(`tandoor.local`)"
volumes:
nginx_config:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/tandoor/nginx_config'
staticfiles:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/tandoor/staticfiles'
mediafiles:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/tandoor/mediafiles'
postgresql:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/app/tandoor/db'
networks:
proxy:
external: true
name: proxy