Compare commits

..

14 Commits

37 changed files with 725 additions and 97 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 131 KiB

View File

@ -1,30 +1,37 @@
# mr-vercetti/homeserver
![Dashboard](.misc/dashboard.jpg)
This is my home server project that I started because I value the privacy of my data, I don't like paying subscriptions and because self-hosting is really fucking cool.
This is my home server project that I started because I value the privacy of my data, I don't like paying subscriptions and because self-hosting is really cool.
## Services
All services are deployed using Docker compose and are run as a non-root user.
All services are deployed using Docker Compose stacks.
### Maintenance
* [ddclient](https://github.com/linuxserver/docker-ddclient) - DDNS
* [SWAG](https://github.com/linuxserver/docker-swag) - reverse proxy with SSL certbot and fail2ban
* [watchtower](https://github.com/containrrr/watchtower) - notifications about docker image updates
* [Duplicati](https://github.com/linuxserver/docker-duplicati) - cool backup
software
* [Backrest](https://github.com/garethgeorge/backrest) - backup solution, restic frontend
* [Uptime Kuma](https://github.com/louislam/uptime-kuma) - fancy uptime monitoring tool
* [Scrutiny](https://github.com/AnalogJ/scrutiny) - S.M.A.R.T monitoring
* [Beszel](https://github.com/henrygd/beszel) - monitoring dashboard
* [Dozzle](https://github.com/amir20/dozzle) - Docker logs viewer
* [gluetun](https://github.com/qdm12/gluetun) - VPN client
### Media
* [Jellyfin](https://github.com/linuxserver/docker-jellyfin) - media server
* [Jellyseer](https://github.com/fallenbagel/jellyseerr) - media request manager
* [Radarr](https://github.com/linuxserver/docker-radarr) - movie collection manager
* [Sonarr](https://github.com/linuxserver/docker-sonarr) - TV show collection manager
* [Bazarr](https://github.com/linuxserver/docker-bazarr) - subtitle manager
* [delugevpn](https://github.com/binhex/arch-delugevpn) - torrent client with VPN and Privoxy
* [YoutubeDL](https://github.com/Tzahi12345/YoutubeDL-Material) - Youtube media downloader
* [qBittorrent](https://github.com/linuxserver/docker-qbittorrent) - qBittorrent + [VueTorrent](https://github.com/VueTorrent/VueTorrent) - cute WebUI
for qBittorrent
* [YoutubeDL](https://github.com/Tzahi12345/YoutubeDL-Material) - YouTube media downloader
* [Prowlarr](https://github.com/Prowlarr/Prowlarr) - indexer
* [Lidarr](https://github.com/Lidarr/Lidarr) - music library manager
* [miniDLNA](https://github.com/vladgh/docker_base_images/tree/main/minidlna) - DLNA server
* [slskd](https://github.com/slskd/slskd) - soulseek client
* [Calibre](https://github.com/crocodilestick/Calibre-Web-Automated) - ebook
manager
* [Calibre-downloader](https://github.com/calibrain/calibre-web-automated-book-downloader) - ebook downloader
### Personal cloud
* [Nextcloud](https://github.com/linuxserver/docker-nextcloud) - filesync/cloud solution
@ -41,10 +48,9 @@ All services are deployed using Docker compose and are run as a non-root user.
* [Wireguard](https://github.com/linuxserver/docker-wireguard) - VPN server
* [Homer](https://github.com/bastienwirtz/homer) - simple dashboard to keep services on hand
* [mr.vercetti.cc](https://git.vercetti.cc/mr-vercetti/mr.vercetti.cc) - my personal blog
* [static-file-server](https://github.com/halverneus/static-file-server) - static file server
* [widmo.cc](https://git.vercetti.cc/mr-vercetti/widmo.cc) - my film photo
project
* [listmonk](https://github.com/knadh/listmonk) - mail sending/newsletter service
## Storage solution
I went with [MergerFS](https://github.com/trapexit/mergerfs) and [SnapRAID](https://github.com/amadvance/snapraid), which allows me a great deal of flexibility and still keeps my data safe. Array is synchronized and scrubbed automatically via [snapraid-runner](https://github.com/Chronial/snapraid-runner) running from crontab.
## Setup
To be completed.
I went with [MergerFS](https://github.com/trapexit/mergerfs) and [SnapRAID](https://github.com/amadvance/snapraid), which allows me a great deal of flexibility and still keeps my data safe. Array is synchronized and scrubbed automatically using [snapraid-runner](https://github.com/Chronial/snapraid-runner) running from crontab.

6
crontab Normal file
View File

@ -0,0 +1,6 @@
# SnapRAID
30 4 * * * python3 /opt/snapraid-runner/snapraid-runner.py --conf /etc/snapraid-runner.conf --ignore-deletethreshold
# LG TV renew dev mode (https://github.com/webosbrew/dev-manager-desktop)
0 * * * * /etc/tv-renew-devmode.sh >> /var/log/tv-renew-devmode.log 2>&1
# DNS issues fix with Torguard
0 1 * * * /apps/homeserver/docker/torguard-fix.sh

View File

@ -72,3 +72,27 @@ DRONE_USER_CREATE=username:<--USERNAME-->,machine:false,admin:true,token:${DRONE
COLLABORA_USERNAME=
COLLABORA_PASSWORD=
COLLABORA_DOMAIN=
# listmonk
LISTMONK_POSTGRES_USER=
LISTMONK_POSTGRES_PASSWORD=
LISTMONK_POSTGRES_DB=
# ghostfolio
GHOSTFOLIO_ACCESS_TOKEN_SALT=
GHOSTFOLIO_JWT_SECRET_KEY=
GHOSTFOLIO_DB=
GHOSTFOLIO_DB_USER=
GHOSTFOLIO_DB_PASSWORD=
GHOSTFOLIO_DB_URL=postgresql://${GHOSTFOLIO_DB_USER}:${GHOSTFOLIO_DB_PASSWORD}@ghostfolio-db:5432/${GHOSTFOLIO_DB}?connect_timeout=300&sslmode=prefer
GHOSTFOLIO_REDIS_PASSWORD=
# joplin
JOPLIN_POSTGRES_USER=
JOPLIN_POSTGRES_PASSWORD=
JOPLIN_POSTGRES_DB=
JOPLIN_BASE_URL=
# slskd
SLSKD_SLSK_USERNAME=
SLSKD_SLSK_PASSWORD=

View File

@ -0,0 +1,18 @@
services:
blackmesa:
image: mrvercetti/blackmesa-coop-server
container_name: blackmesa
environment:
- GAME_PARAMS=-port 27015 +maxplayers 2 +map bm_c1a1d -debug
- GAME_NAME=${BLACKMESA_SERVER_NAME}
- GAME_PASSWORD=${BLACKMESA_SERVER_PASSWORD}
networks:
- blackmesa
ports:
- ${BLACKMESA_SERVER_PORT}:27015
- ${BLACKMESA_SERVER_PORT}:27015/udp
restart: unless-stopped
networks:
blackmesa:
name: blackmesa

View File

@ -0,0 +1,46 @@
services:
ghostfolio:
image: ghostfolio/ghostfolio
container_name: ghostfolio
environment:
DATABASE_URL: ${GHOSTFOLIO_DB_URL}
NODE_ENV: production
REDIS_HOST: ghostfolio-cache
REDIS_PASSWORD: ${GHOSTFOLIO_REDIS_PASSWORD}
REDIS_PORT: 6379
JWT_SECRET_KEY: ${GHOSTFOLIO_JWT_SECRET_KEY}
ACCESS_TOKEN_SALT: ${GHOSTFOLIO_ACCESS_TOKEN_SALT}
ports:
- 3333:3333
networks:
- ghostfolio
- proxy
depends_on:
- ghostfolio-db
- ghostfolio-cache
ghostfolio-db:
image: postgres:15
container_name: ghostfolio-db
volumes:
- ${APPS_DIR}/ghostfolio/postgres:/var/lib/postgresql/data
networks:
- ghostfolio
environment:
- POSTRES_DB=${GHOSTFOLIO_DB}
- POSTGRES_USER=${GHOSTFOLIO_DB_USER}
- POSTGRES_PASSWORD=${GHOSTFOLIO_DB_PASSWORD}
ghostfolio-cache:
image: redis:alpine
container_name: ghostfolio-cache
networks:
- ghostfolio
command: ['redis-server', '--requirepass', $GHOSTFOLIO_REDIS_PASSWORD]
networks:
ghostfolio:
name: ghostfolio
proxy:
external:
name: proxy

View File

@ -0,0 +1,18 @@
services:
homarr:
container_name: homarr
image: ghcr.io/ajnart/homarr
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ${APPS_DIR}/homarr/configs:/app/data/configs
- ${APPS_DIR}/homarr/icons:/app/public/icons
- ${APPS_DIR}/homarr/data:/data
networks:
- homarr
ports:
- '7575:7575'
restart: unless-stopped
networks:
homarr:
name: homarr

View File

@ -0,0 +1,43 @@
services:
joplin-db:
image: postgres:16
container_name: joplin-db
volumes:
- ${APPS_DIR}/joplin/postgres:/var/lib/postgresql/data
networks:
- joplin
ports:
- "5432:5432"
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=${JOPLIN_POSTGRES_PASSWORD}
- POSTGRES_USER=${JOPLIN_POSTGRES_USER}
- POSTGRES_DB=${JOPLIN_POSTGRES_DB}
joplin:
image: joplin/server
container_name: joplin
networks:
- proxy
- joplin
ports:
- "22300:22300"
environment:
- APP_PORT=22300
- APP_BASE_URL=${JOPLIN_BASE_URL}
- DB_CLIENT=pg
- POSTGRES_PASSWORD=${JOPLIN_POSTGRES_PASSWORD}
- POSTGRES_DATABASE=${JOPLIN_POSTGRES_DB}
- POSTGRES_USER=${JOPLIN_POSTGRES_USER}
- POSTGRES_PORT=5432
- POSTGRES_HOST=joplin-db
depends_on:
- joplin-db
restart: unless-stopped
networks:
proxy:
external:
name: proxy
joplin:
name: joplin

View File

@ -0,0 +1,28 @@
services:
api:
image: localai/localai:v2.10.1-ffmpeg-core
container_name: localai-api
ports:
- 8877:8080
networks:
- localai
volumes:
- ${APPS_DIR}/localai/models:/models:cached
command: ["tinyllama-chat"]
chatgpt:
depends_on:
api:
condition: service_healthy
image: ghcr.io/mckaywrigley/chatbot-ui:main
ports:
- 3003:3000
networks:
- localai
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- OPENAI_API_HOST=http://api:8080
networks:
localai:
name: localai

View File

@ -0,0 +1,28 @@
services:
minecraft:
image: itzg/minecraft-server
container_name: minecraft
networks:
- minecraft
ports:
- ${MINECRAFT_SERVER_PORT}:25565
environment:
- VERSION=1.20.4
- OVERRIDE_SERVER_PROPERTIES=true
- EULA=TRUE
- MAX_PLAYERS=4
- MOTD=${MINECRAFT_SERVER_MOTD}
- DIFFICULTY=easy
- ALLOW_NETHER=true
- ONLINE_MODE=FALSE
- ENABLE_RCON=true
- SERVER_NAME=${MINECRAFT_SERVER_NAME}
volumes:
- ${DATA_DIR}/minecraft-data:/data
tty: true
stdin_open: true
restart: unless-stopped
networks:
minecraft:
name: minecraft

View File

@ -0,0 +1,66 @@
services:
grafana:
image: grafana/grafana
container_name: grafana
user: "0"
volumes:
- ${APPS_DIR}/monitoring/grafana:/var/lib/grafana
ports:
- "3005:3000"
networks:
- monitoring
restart: unless-stopped
loki:
image: grafana/loki
container_name: loki
volumes:
- ${APPS_DIR}/monitoring/loki:/etc/loki
ports:
- "3100:3100"
command: -config.file=/etc/loki/loki-config.yml -config.expand-env=true
networks:
- monitoring
restart: unless-stopped
promtail:
image: grafana/promtail
container_name: promtail
volumes:
- /var/log:/var/log #map the log folder.
- ${APPS_DIR}/monitoring/promtail:/etc/promtail
command: -config.file=/etc/promtail/promtail-config.yml
networks:
- monitoring
restart: unless-stopped
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ${APPS_DIR}/monitoring/prometheus:/etc/prometheus
ports:
- "9090:9090"
networks:
- monitoring
command:
- '--config.file=/etc/prometheus/prometheus.yml'
restart: unless-stopped
node-exporter:
image: prom/node-exporter
container_name: node-exporter
network_mode: host # Not compatible with ports declaration. This service will expose port 9100.
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
restart: unless-stopped
networks:
monitoring:

View File

@ -0,0 +1,16 @@
services:
qbittorrent:
image: linuxserver/qbittorrent
container_name: qbittorrent
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TIMEZONE}
- UMASK_SET=022
- WEBUI_PORT=8183
network_mode: "container:gluetun"
volumes:
- ${APPS_DIR}/qbittorrent/config:/config
- ${DATA_DIR}/downloads:/downloads
- ${APPS_DIR}/qbittorrent/vuetorrent:/vuetorrent
restart: unless-stopped

View File

@ -0,0 +1,33 @@
qbittorrentvpn:
image: binhex/arch-qbittorrentvpn
container_name: qbittorrentvpn
networks:
- media
cap_add:
- NET_ADMIN
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TIMEZONE}
- VPN_ENABLED=yes
- VPN_PROV=custom
- VPN_CLIENT=wireguard
- ENABLE_PRIVOXY=no
- LAN_NETWORK=${LAN_NETWORK}
- NAME_SERVERS=1.1.1.1, 1.0.0.1
- WEBUI_PORT=8183
- DEBUG=true
- UMASK=000
volumes:
- ${APPS_DIR}/qbittorrentvpn:/config
- ${DATA_DIR}/downloads:/data
- /etc/localtime:/etc/localtime:ro
ports:
- 8183:8183
- 8118:8118
- 6881:6881
- 6881:6881/udp
sysctls:
- "net.ipv4.conf.all.src_valid_mark=1"
privileged: true
restart: unless-stopped

View File

@ -0,0 +1,16 @@
services:
quakejs:
image: treyyoder/quakejs
container_name: quakejs
networks:
- quakejs
environment:
- HTTP_PORT=9011
- SERVER=192.168.0.100
ports:
- "9011:80"
- "27960:27960"
networks:
quakejs:
name: quakejs

View File

@ -0,0 +1,25 @@
services:
stable-diffusion:
image: ghcr.io/ai-dock/stable-diffusion-webui:latest-cpu
container_name: stable-diffusion-webui
devices:
- "/dev/dri:/dev/dri"
volumes:
- ${APPS_DIR}/stable-diffusion/workspace:${WORKSPACE:-/workspace/}:rshared
- ${APPS_DIR}/stable-diffusion/config/provisioning/default.sh:/opt/ai-dock/bin/provisioning.sh
ports:
- ${WEBUI_PORT_HOST:-7860}:${WEBUI_PORT_HOST:-7860}
networks:
- stable-diffusion
environment:
- DIRECT_ADDRESS=${DIRECT_ADDRESS:-127.0.0.1}
- WORKSPACE=/workspace
- WORKSPACE_SYNC=false
- WEB_ENABLE_AUTH=false
- WEBUI_PORT_HOST=${WEBUI_PORT_HOST:-7860}
- WEBUI_PORT_LOCAL=${WEBUI_PORT_LOCAL:-17860}
- WEBUI_METRICS_PORT=${WEBUI_METRICS_PORT:-27860}
networks:
stable-diffusion:
name: stable-diffusion

View File

@ -0,0 +1,18 @@
services:
svencoop:
image: mrvercetti/svencoop-server
container_name: svencoop
environment:
- GAME_NAME=${SVENCOOP_SERVER_NAME}
- GAME_PASSWORD=${SVENCOOP_SERVER_PASSWORD}
- GAME_PARAMS="-num_edicts 3072 +sv_lan 0 +map hl_c16_a1 -port 27015 -console -debug;"
networks:
- svencoop
ports:
- ${SVENCOOP_SERVER_PORT}:27015
- ${SVENCOOP_SERVER_PORT}:27015/udp
restart: unless-stopped
networks:
svencoop:
name: svencoop

View File

@ -1,27 +1,53 @@
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Please provide command to execute: 'up', 'stop' or 'restart'"
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ $# -lt 1 ]; then
echo "Please provide command to execute: 'up', 'stop', 'restart', or 'recreate'"
exit 1
fi
command="$1"
for stack in stacks/*/*
do
case "$command" in
"up")
docker-compose -f "${stack}" --env-file .env up -d
;;
"stop")
docker-compose -f "${stack}" --env-file .env stop
;;
"restart")
docker-compose -f "${stack}" --env-file .env restart
;;
*)
echo "Wrong command. Please use 'up', 'stop' or 'restart'"
case "$command" in
"up")
for stack in "$BASE_DIR"/stacks/*/*
do
docker compose -f "${stack}" --env-file "$BASE_DIR/.env" up -d
done
;;
"stop" | "restart")
for stack in "$BASE_DIR"/stacks/*/*
do
docker compose -f "${stack}" --env-file "$BASE_DIR/.env" $command
done
;;
"recreate")
if [ $# -eq 2 ]; then
stack_name="$2"
service_name="$2"
elif [ $# -eq 3 ]; then
stack_name="$2"
service_name="$3"
else
echo "Usage: $0 recreate <stack_name> <service_name>"
exit 1
;;
esac
done
fi
stack_file="$BASE_DIR/stacks/${stack_name}/${stack_name}.yml"
if [ ! -f "$stack_file" ]; then
echo "Stack file '$stack_file' does not exist"
exit 1
fi
docker compose -f ${stack_file} --env-file "$BASE_DIR/.env" stop ${service_name}
docker compose -f ${stack_file} --env-file "$BASE_DIR/.env" rm -f ${service_name}
docker compose -f ${stack_file} --env-file "$BASE_DIR/.env" up -d ${service_name}
;;
*)
echo "Wrong command. Please use 'up', 'stop', 'restart', or 'recreate'"
exit 1
;;
esac

View File

@ -0,0 +1,26 @@
services:
backrest:
image: garethgeorge/backrest
container_name: backrest
networks:
- backrest
ports:
- 9898:9898
volumes:
- ${APPS_DIR}/backrest/data:/data
- ${APPS_DIR}/backrest/config:/config
- ${APPS_DIR}/backrest/cache:/cache
- /apps:/userdata/docker # [optional] mount local paths to backup here.
- ${DATA_DIR}/nextcloud-data:/userdata/nextcloud
- ${DATA_DIR}/backup/hustler:/repos/hustler # [optional] mount repos if using local storage, not necessary for remotes e.g. B2, S3, etc.
- /var/run/docker.sock:/var/run/docker.sock:ro # [optional] if you want to manage containers before/after backup
environment:
- BACKREST_DATA=/data # path for backrest data. restic binary and the database are placed here.
- BACKREST_CONFIG=/config/config.json # path for the backrest config file.
- XDG_CACHE_HOME=/cache # path for the restic cache which greatly improves performance.
- TZ=${TIMEZONE} # set the timezone for the container, used as the timezone for cron jobs.
restart: unless-stopped
networks:
backrest:
name: backrest

4
docker/stacks/bitwarden/bitwarden.yml Normal file → Executable file
View File

@ -22,7 +22,7 @@ services:
networks:
proxy:
external:
name: proxy
name: proxy
external: true
bitwarden:
name: bitwarden

6
docker/stacks/collabora/collabora.yml Normal file → Executable file
View File

@ -1,6 +1,6 @@
services:
collabora:
image: collabora/code
image: collabora/code:24.04.6.1.1
container_name: collabora
environment:
- password=${COLLABORA_PASSWORD}
@ -16,7 +16,7 @@ services:
networks:
proxy:
external:
name: proxy
name: proxy
external: true
collabora:
name: collabora

0
docker/stacks/ddclient/ddclient.yml Normal file → Executable file
View File

View File

@ -0,0 +1,22 @@
services:
gluetun:
image: qmcgaw/gluetun:v3.38
container_name: gluetun
cap_add:
- NET_ADMIN
environment:
- VPN_SERVICE_PROVIDER=custom
- VPN_TYPE=wireguard
volumes:
- ${APPS_DIR}/gluetun:/gluetun
networks:
- gluetun
ports:
# qbittorrent
- "8183:8183"
# slskd
- "5030:5030"
networks:
gluetun:
name: gluetun

0
docker/stacks/homer/homer.yml Normal file → Executable file
View File

View File

@ -0,0 +1,39 @@
services:
listmonk-db:
image: postgres:13-alpine
container_name: listmonk-db
environment:
- POSTGRES_PASSWORD=${LISTMONK_POSTGRES_PASSWORD}
- POSTGRES_USER=${LISTMONK_POSTGRES_USER}
- POSTGRES_DB=${LISTMONK_POSTGRES_DB}
volumes:
- ${APPS_DIR}/listmonk/postgresql:/var/lib/postgresql/data
ports:
- "9432:5432"
networks:
- listmonk
healthcheck:
test: ["CMD-SHELL", "pg_isready -U listmonk"]
interval: 10s
timeout: 5s
retries: 6
restart: unless-stopped
listmonk:
image: listmonk/listmonk
container_name: listmonk
environment:
- TZ=${TIMEZONE}
volumes:
- ${APPS_DIR}/listmonk/config.toml:/listmonk/config.toml
ports:
- "9000:9000"
networks:
- listmonk
depends_on:
- listmonk-db
restart: unless-stopped
networks:
listmonk:
name: listmonk

140
docker/stacks/media/media.yml Normal file → Executable file
View File

@ -16,6 +16,7 @@ services:
- ${APPS_DIR}/jellyfin:/config
- ${DATA_DIR}/media/movies:/data/movies:ro
- ${DATA_DIR}/media/tvshows:/data/tvshows:ro
- ${DATA_DIR}/media/music:/data/music:ro
ports:
- 8096:8096
devices:
@ -23,6 +24,22 @@ services:
- /dev/dri/card0:/dev/dri/card0
restart: unless-stopped
jellyseerr:
image: fallenbagel/jellyseerr
container_name: jellyseerr
networks:
- proxy
- media
environment:
- LOG_LEVEL=debug
- TZ=${TIMEZONE}
- PORT=5055
ports:
- 5055:5055
volumes:
- ${APPS_DIR}/jellyserr:/app/config
restart: unless-stopped
minidlna:
image: vladgh/minidlna
container_name: minidlna
@ -36,7 +53,7 @@ services:
- ${DATA_DIR}/media/music:/media
radarr:
image: lscr.io/linuxserver/radarr:4.3.2
image: lscr.io/linuxserver/radarr
container_name: radarr
networks:
- media
@ -84,6 +101,17 @@ services:
- 9696:9696
restart: unless-stopped
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr
container_name: flaresolverr
networks:
- media
environment:
- TZ=${TIMEZONE}
ports:
- 8191:8191
restart: unless-stopped
bazarr:
image: lscr.io/linuxserver/bazarr
container_name: bazarr
@ -118,43 +146,95 @@ services:
- 8686:8686
restart: unless-stopped
delugevpn:
image: binhex/arch-delugevpn
container_name: delugevpn
qbittorrent:
image: linuxserver/qbittorrent
container_name: qbittorrent
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TIMEZONE}
- UMASK_SET=022
- WEBUI_PORT=8183
network_mode: "container:gluetun"
volumes:
- ${APPS_DIR}/qbittorrent/config:/config
- ${DATA_DIR}/downloads:/downloads
- ${APPS_DIR}/qbittorrent/vuetorrent:/vuetorrent
restart: unless-stopped
ytdl-material:
image: tzahi12345/youtubedl-material:sha-208cd83
container_name: ytdl-material
networks:
- media
cap_add:
- NET_ADMIN
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TIMEZONE}
- VPN_ENABLED=yes
- VPN_PROV=custom
- VPN_CLIENT=wireguard
- ENABLE_PRIVOXY=yes
- LAN_NETWORK=${LAN_NETWORK}
- NAME_SERVERS=1.1.1.1, 1.0.0.1
- DELUGE_DAEMON_LOG_LEVEL=info
- DELUGE_WEB_LOG_LEVEL=info
- DEBUG=true
- UMASK=000
- UID=${PUID}
- GID=${PGID}
- ALLOW_CONFIG_MUTATIONS=true
volumes:
- ${APPS_DIR}/delugevpn:/config
- ${DATA_DIR}/downloads:/downloads
- /etc/localtime:/etc/localtime:ro
- ${APPS_DIR}/ytdl-material:/app/appdata
- ${DATA_DIR}/ytdl/audio:/app/audio
- ${DATA_DIR}/ytdl/video:/app/video
- ${DATA_DIR}/ytdl/subscriptions:/app/subscriptions
- ${DATA_DIR}/ytdl/users:/app/users
ports:
- 8112:8112
- 58846:58846
- 8118:8118
sysctls:
- "net.ipv4.conf.all.src_valid_mark=1"
privileged: true
- "8998:17442"
restart: unless-stopped
slskd:
image: slskd/slskd
container_name: slskd
user: ${PUID}:${PGID}
environment:
- TZ=${TIMEZONE}
- SLSKD_REMOTE_FILE_MANAGEMENT=true
- SLSKD_SLSK_USERNAME=${SLSKD_SLSK_USERNAME}
- SLSKD_SLSK_PASSWORD=${SLSKD_SLSK_PASSWORD}
- SLSKD_SHARED_DIR=/app/downloads
network_mode: "container:gluetun"
volumes:
- ${APPS_DIR}/slskd:/app/data
- ${DATA_DIR}/downloads/slskd/incomplete:/app/incomplete
- ${DATA_DIR}/media/music:/app/downloads
restart: unless-stopped
calibre:
image: crocodilestick/calibre-web-automated
container_name: calibre
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TIMEZONE}
volumes:
- ${APPS_DIR}/calibre:/config
- ${DATA_DIR}/calibre/ingest:/cwa-book-ingest
- ${DATA_DIR}/calibre/library:/calibre-library
networks:
- media
ports:
- 8083:8083
restart: unless-stopped
calibre-downloader:
image: ghcr.io/calibrain/calibre-web-automated-book-downloader
container_name: calibre-downloader
environment:
- FLASK_PORT=8084
- FLASK_DEBUG=false
- CLOUDFLARE_PROXY_URL=http://flaresolverr:8191
- INGEST_DIR=/cwa-book-ingest
- BOOK_LANGUAGE=pl
volumes:
- ${DATA_DIR}/calibre/ingest:/cwa-book-ingest
networks:
- media
ports:
- 8084:8084
restart: unless-stopped
networks:
proxy:
external:
name: proxy
name: proxy
external: true
media:
name: media

View File

@ -34,9 +34,47 @@ services:
- "/dev/nvme0"
restart: unless-stopped
beszel:
image: henrygd/beszel
container_name: beszel
networks:
- monitoring
ports:
- 8091:8090
volumes:
- ${APPS_DIR}/beszel:/beszel_data
restart: unless-stopped
beszel-agent:
image: henrygd/beszel-agent
container_name: beszel-agent
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /mnt/parity1/.beszel:/extra-filesystems/sdd1:ro
- /mnt/disk1/.beszel:/extra-filesystems/sdb1:ro
- /mnt/disk2/.beszel:/extra-filesystems/sda1:ro
- /mnt/disk3/.beszel:/extra-filesystems/sdc1:ro
environment:
- PORT=45876
# Do not remove quotes around the key
- KEY=${BESZEL_SSH_KEY}
restart: unless-stopped
dozzle:
image: amir20/dozzle
container_name: dozzle
networks:
- monitoring
ports:
- 8081:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
networks:
proxy:
external:
name: proxy
name: proxy
external: true
monitoring:
name: monitoring

4
docker/stacks/mrvercetticc/mrvercetticc.yml Normal file → Executable file
View File

@ -9,7 +9,7 @@ services:
networks:
proxy:
external:
name: proxy
name: proxy
external: true
mrvercetticc:
name: mrvercetticc

4
docker/stacks/nextcloud/nextcloud.yml Normal file → Executable file
View File

@ -52,7 +52,7 @@ services:
networks:
proxy:
external:
name: proxy
name: proxy
external: true
nextcloud:
name: nextcloud

4
docker/stacks/softdev/softdev.yml Normal file → Executable file
View File

@ -87,7 +87,7 @@ services:
networks:
proxy:
external:
name: proxy
name: proxy
external: true
softdev:
name: softdev

0
docker/stacks/swag/swag.yml Normal file → Executable file
View File

0
docker/stacks/watchtower/watchtower.yml Normal file → Executable file
View File

View File

@ -0,0 +1,17 @@
services:
widmocc:
image: mrvercetti/widmocc
container_name: widmocc
networks:
- widmocc
- proxy
ports:
- 1313:80
restart: unless-stopped
networks:
proxy:
name: proxy
external: true
widmocc:
name: widmocc

0
docker/stacks/wireguard/wireguard.yml Normal file → Executable file
View File

View File

@ -1,23 +0,0 @@
services:
ytdl-material:
image: tzahi12345/youtubedl-material
container_name: ytdl-material
networks:
- ytdl-material
environment:
- UID=${PUID}
- GID=${PGID}
- ALLOW_CONFIG_MUTATIONS=true
volumes:
- ${APPS_DIR}/ytdl-material:/app/appdata
- ${DATA_DIR}/ytdl/audio:/app/audio
- ${DATA_DIR}/ytdl/video:/app/video
- ${DATA_DIR}/ytdl/subscriptions:/app/subscriptions
- ${DATA_DIR}/ytdl/users:/app/users
ports:
- "8998:17442"
restart: unless-stopped
networks:
ytdl-material:
name: ytdl-material

12
docker/torguard-fix.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/bash
dir="/apps/homeserver/docker/appdata/gluetun/wireguard"
file="$dir/wg0.conf"
file_old="$dir/wg0.conf.old"
file_tmp="$dir/wg0.conf.tmp"
mv $file $file_tmp
mv $file_old $file
mv $file_tmp $file_old
bash /apps/homeserver/docker/mgmt.sh recreate media qbittorrentvpn