1
0

Compare commits

...

58 Commits

Author SHA1 Message Date
947d48c860 navidrome: update to 0.57.0 2025-07-03 08:08:12 +02:00
a9990ee8db mariadb: add MARIADB_AUTO_UPGRADE 2025-06-21 22:01:36 +02:00
180bb14a05 gitea: update to 1.24.0 2025-06-21 22:00:39 +02:00
5e0a6d99e2 trilium: switch to triliumnext and pin to 0.95.0 2025-06-21 22:00:18 +02:00
dac13eb9e3 navidrome: update to 0.55.2 2025-05-11 21:54:41 +02:00
be215b6bb3 beets: run as non-root 2025-05-11 21:54:12 +02:00
81f17e11dd sabnzbd: update to 4.5.1 2025-05-05 13:28:09 +02:00
8e10ac15d7 audiobookshelf: pin to 2.20.0 2025-04-08 09:50:49 +02:00
17a87ed5d7 sabnzbd: update to 4.5.0 2025-04-08 09:50:25 +02:00
290155e5d4 jellyfin: update to 10.10.7 2025-04-06 17:22:48 +02:00
e448803a8e stash: update to 0.28.1 2025-03-21 10:07:15 +01:00
892497b322 komga: add external port 2025-03-18 11:30:07 +01:00
7b2c67b87c kavita: pin and update to 0.8.5 2025-03-11 07:59:08 +01:00
201a2395fc navidrome: update to 0.55.0 2025-03-11 07:58:48 +01:00
20ef2c2f9f beets: pin and update to 2.2.0 2025-03-11 07:58:33 +01:00
71e5d85a6a navidrome: update to 0.54.5 2025-02-24 12:58:59 +01:00
bec7bb5b66 kavita: add 2025-02-22 11:47:22 +01:00
c51bac41b0 ntfy: fix caddy labels 2025-02-20 13:02:51 +01:00
387d6e89a5 komga: update to 1.20.0 2025-02-20 12:49:31 +01:00
5931869c0d prowlarr: expose port 2025-02-19 21:59:29 +01:00
9111afff2f sabnzbd: don't publish to internet 2025-02-19 21:47:56 +01:00
e4830550c2 caddy: finish migrating to caddy-docker-proxy 2025-02-19 21:42:57 +01:00
1b311df046 caddy: add tailscale socket 2025-02-19 11:59:38 +01:00
f5fe027ae3 calibre-web: fix version and port 2025-02-19 11:59:38 +01:00
7b49e6af7d caddy: switch to caddy-docker-proxy 2025-02-19 11:58:13 +01:00
815f0cf55d sabnzbd: update ports 2025-02-18 10:48:20 +01:00
dd3ed2f4bc jellyfin: update to 10.10.6 2025-02-18 10:48:20 +01:00
2fd65fcbdd calibre-web: add 2025-02-18 10:14:58 +01:00
0cd308329b jellyfin: update to 10.10.4 2025-01-22 09:13:53 +01:00
3df03db596 sabnzbd: update to 4.4.1 2025-01-22 09:12:47 +01:00
e0d357ca05 syncthing: add storage volume 2024-12-31 06:26:21 +01:00
b0882532a7 handbrake-server: restart unless stopped 2024-12-31 06:25:22 +01:00
f913a10ee1 syncthing: move shares to a subfolder 2024-12-31 06:24:00 +01:00
5c8d6f9140 sabnzbd: pin to 4.4.0 2024-12-14 13:26:53 +01:00
a69ba8c7d7 prowlarr: pin to 1.27.0.4852 2024-12-14 13:23:12 +01:00
46e7bcb874 syncthing: pin to 1.28.1, move shared folders 2024-12-12 13:26:50 +01:00
9e385acc44 redlib: remove external port 2024-12-12 13:26:10 +01:00
2162970f37 vaulwarden: update to 1.32.1 2024-12-01 11:10:06 +01:00
0392f25835 handbrake-server: update to 0.7.3 2024-12-01 11:09:43 +01:00
5a8d7936c2 redlib: add 2024-11-22 12:41:31 +01:00
1a931d24b6 handbrake-server: add 2024-11-18 07:33:51 +01:00
a0b5980fa5 navidrome: enable dev panel again 2024-11-18 07:15:47 +01:00
93474cc92c remove cruft 2024-11-10 11:12:46 +01:00
146b254679 gluetun: fix env file 2024-11-08 21:50:54 +01:00
c68ec26d58 gluetun: fix formatting, assign ip, turn on http proxy 2024-11-08 21:50:31 +01:00
d5902e14f2 gluetun-japan: add 2024-11-07 15:10:18 +01:00
e6e16cc4ad jellyfin: update to 10.10.1 2024-11-06 10:14:47 +01:00
62eaa4e070 linkace: pin to 1.15.4 2024-11-06 10:14:20 +01:00
8f339cb33e stash: pin to 0.27.2 2024-11-06 10:13:47 +01:00
ae1a5d8c3b navidrome: update to 0.53.3 2024-10-08 11:41:46 +02:00
6a8cd4e988 jellyfin: update to 10.9.11 2024-09-09 18:39:55 +02:00
613fd10ae6 replace 7daystodie server container 2024-08-18 09:45:30 +02:00
272e311cdc jellyfin: pin to 10.9.9 2024-08-08 10:29:24 +02:00
2e371d2767 add .gitignore 2024-08-07 13:58:25 +02:00
b3f2b47a12 vaultwarden: enable e-mail 2024-08-07 13:58:12 +02:00
bb0beb298e vaultwarden: fix and enable push notification 2024-08-07 13:57:55 +02:00
506d68b0b8 vaulwarden: pin to specific version 2024-08-07 13:48:16 +02:00
f4fa7d2dd3 mealie: update to 1.9.0 2024-08-07 13:48:11 +02:00
27 changed files with 319 additions and 262 deletions

9
.env
View File

@ -1,5 +1,7 @@
REGISTRY_URL=registry.kucharczyk.xyz REGISTRY_URL=registry.kucharczyk.xyz
DOMAIN=kucharczyk.xyz DOMAIN=kucharczyk.xyz
TS_DOMAIN=jacob-shark.ts.net
TS_DOMAIN_NAS=nas.${TS_DOMAIN}
TZ=Europe/Prague TZ=Europe/Prague
STORAGE_PATH=/srv/mergerfs/storage STORAGE_PATH=/srv/mergerfs/storage
MEDIA_PATH=${STORAGE_PATH}/media MEDIA_PATH=${STORAGE_PATH}/media
@ -105,3 +107,10 @@ VAULTWARDEN_EXTERNAL_PORT=8666
VAULTWARDEN_INTERNAL_PORT=80 VAULTWARDEN_INTERNAL_PORT=80
BAZARR_EXTERNAL_PORT=6767 BAZARR_EXTERNAL_PORT=6767
BAZARR_INTERNAL_PORT=6767 BAZARR_INTERNAL_PORT=6767
GLUETUN_JAPAN_INTERNAL_PORT=8888
GLUETUN_JAPAN_EXTERNAL_PORT=8888
HANDBRAKER_SERVER_INTERNAL_PORT=9999
HANDBRAKER_SERVER_EXTERNAL_PORT=9997
REDLIB_EXTERNAL_PORT=8088
SABNZBD_EXTERNAL_PORT=8081
SABNZBD_INTERNAL_PORT=8080

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
git-crypt-key

View File

@ -1,4 +1,13 @@
--- ---
configs:
caddyfile:
content: |
notes-old.kucharczyk.xyz {
handle {
root * /srv/notes
file_server
}
}
include: include:
- services/bazarr.yml - services/bazarr.yml
@ -18,23 +27,36 @@ include:
- services/portainer.yml - services/portainer.yml
- services/drone/drone.yml - services/drone/drone.yml
- services/enshrouded.yml - services/enshrouded.yml
- services/7dtdserver.yml
- services/gluetun.yml
- services/handbrake-server.yml
- services/redlib.yml
- services/calibre-web.yml
- services/kavita.yml
services: services:
caddy: caddy:
image: caddy image: lucaslorentz/caddy-docker-proxy:ci-alpine
container_name: caddy container_name: caddy
ports: ports:
- "${TIMETRACKER_EXTERNAL_PORT}:${TIMETRACKER_INTERNAL_PORT}" - "${TIMETRACKER_EXTERNAL_PORT}:${TIMETRACKER_INTERNAL_PORT}"
- "${DENDRON_NOTES_EXTERNAL_PORT}:${DENDRON_NOTES_INTERNAL_PORT}" - "${DENDRON_NOTES_EXTERNAL_PORT}:${DENDRON_NOTES_INTERNAL_PORT}"
- 80:80 - 80:80
- 443:443 - 443:443
user: ${PUID} environment:
- CADDY_INGRESS_NETWORKS=docker-compose-templates_public
- CADDY_DOCKER_CADDYFILE_PATH=/Caddyfile
configs:
- source: caddyfile
target: /Caddyfile
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/caddy/etc:/etc/caddy" - "${DOCKER_STORAGE_PATH}/caddy/etc:/etc/caddy"
- "${DOCKER_STORAGE_PATH}/caddy/data:/data" - "${DOCKER_STORAGE_PATH}/caddy/data:/data"
- "${DOCKER_STORAGE_PATH}/caddy/config:/config" - "${DOCKER_STORAGE_PATH}/caddy/config:/config"
- "/var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock"
- "/www/notes:/srv/notes" - "/www/notes:/srv/notes"
- "timetracker-static:/srv/timetracker" - "timetracker-static:/srv/timetracker"
- /var/run/docker.sock:/var/run/docker.sock
networks: networks:
public: public:
ipv4_address: 192.168.240.2 ipv4_address: 192.168.240.2
@ -60,16 +82,30 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.3 ipv4_address: 192.168.240.3
labels:
caddy: tracker.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 8001 }}"
caddy.handle_path: "/static/*"
caddy.handle_path.root: "* /srv/timetracker"
caddy.handle_path.file_server:
caddy.handle: /robots.txt
caddy.handle.root: "* /srv/timetracker"
caddy.handle.file_server:
restart: unless-stopped restart: unless-stopped
trilium: trilium:
image: zadam/trilium image: triliumnext/notes:v0.95.0
container_name: trilium container_name: trilium
restart: always restart: always
environment: environment:
- TRILIUM_DATA_DIR=/home/node/trilium-data - TRILIUM_DATA_DIR=/home/node/trilium-data
volumes: volumes:
- ${DOCKER_STORAGE_PATH}/trilium:/home/node/trilium-data - ${DOCKER_STORAGE_PATH}/trilium:/home/node/trilium-data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
labels:
caddy: trilium.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams $TRILIUM_INTERNAL_PORT }}"
ports: ports:
- "${TRILIUM_EXTERNAL_PORT}:${TRILIUM_INTERNAL_PORT}" - "${TRILIUM_EXTERNAL_PORT}:${TRILIUM_INTERNAL_PORT}"
networks: networks:
@ -92,10 +128,17 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.5 ipv4_address: 192.168.240.5
labels:
caddy: "notify.${DOMAIN}, http://notify.${DOMAIN}"
caddy.reverse_proxy: "{{ upstreams $NTFY_INTERNAL_PORT }}"
caddy.@httpget.protocol: http
caddy.@httpget.method: get
caddy.@httpget.path_regexp: "^/([-_a-z0-9]{0,64}$|docs/|static/)"
caddy.redir: "@httpget https://{host}{uri}"
restart: unless-stopped restart: unless-stopped
audiobookshelf: audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf image: ghcr.io/advplyr/audiobookshelf:2.20.0
container_name: audiobookshelf container_name: audiobookshelf
environment: environment:
- AUDIOBOOKSHELF_UID=${PUID} - AUDIOBOOKSHELF_UID=${PUID}
@ -114,11 +157,10 @@ services:
restart: unless-stopped restart: unless-stopped
beets: beets:
image: ${REGISTRY_URL}/beets:latest image: lscr.io/linuxserver/beets:2.2.0
container_name: beets container_name: beets
user: 1000:100
environment: environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ} - TZ=${TZ}
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/beets:/config" - "${DOCKER_STORAGE_PATH}/beets:/config"
@ -133,7 +175,7 @@ services:
mealie: mealie:
container_name: mealie container_name: mealie
image: hkotel/mealie:v1.5.1 image: hkotel/mealie:v1.9.0
environment: environment:
PUID: ${PUID} PUID: ${PUID}
PGID: ${PGID} PGID: ${PGID}
@ -145,6 +187,9 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.8 ipv4_address: 192.168.240.8
labels:
caddy: recipes.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 9000 }}"
restart: unless-stopped restart: unless-stopped
rtorrent: rtorrent:
@ -168,6 +213,9 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.9 ipv4_address: 192.168.240.9
labels:
caddy: torrent.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 9080 }}"
restart: unless-stopped restart: unless-stopped
webhook: webhook:
@ -204,22 +252,8 @@ services:
ipv4_address: 192.168.240.11 ipv4_address: 192.168.240.11
restart: unless-stopped restart: unless-stopped
7daystodie:
image: 7daysserver:latest
container_name: 7dtd
volumes:
- ${DOCKER_STORAGE_PATH}/7daystodie/saves:/home/steam/.local/share/7DaysToDie/Saves
- ${DOCKER_STORAGE_PATH}/7daystodie/server:/home/steam/server
ports:
- 26900-26902:26900-26902/udp
- 18500:8080
networks:
public:
ipv4_address: 192.168.240.12
restart: unless-stopped
stash: stash:
image: stashapp/stash:latest image: stashapp/stash:v0.28.1
container_name: stash container_name: stash
ports: ports:
- "${STASH_EXTERNAL_PORT}:${STASH_INTERNAL_PORT}" - "${STASH_EXTERNAL_PORT}:${STASH_INTERNAL_PORT}"
@ -259,7 +293,7 @@ services:
restart: unless-stopped restart: unless-stopped
navidrome: navidrome:
image: deluan/navidrome image: deluan/navidrome:0.57.0
container_name: navidrome container_name: navidrome
ports: ports:
- "${NAVIDROME_EXTERNAL_PORT}:${NAVIDROME_INTERNAL_PORT}" - "${NAVIDROME_EXTERNAL_PORT}:${NAVIDROME_INTERNAL_PORT}"
@ -272,6 +306,9 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.14 ipv4_address: 192.168.240.14
labels:
caddy: music.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams $NAVIDROME_INTERNAL_PORT }}"
restart: unless-stopped restart: unless-stopped
maloja: maloja:
@ -301,7 +338,7 @@ services:
paperless-ngx: paperless-ngx:
container_name: paperless-ngx container_name: paperless-ngx
image: ghcr.io/paperless-ngx/paperless-ngx:latest image: ghcr.io/paperless-ngx/paperless-ngx:2.0.1
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- redis - redis
@ -375,11 +412,12 @@ services:
restart: unless-stopped restart: unless-stopped
syncthing: syncthing:
image: lscr.io/linuxserver/syncthing:latest image: lscr.io/linuxserver/syncthing:1.28.1
container_name: syncthing container_name: syncthing
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/syncthing:/config" - "${DOCKER_STORAGE_PATH}/syncthing:/config"
- "${STORAGE_PATH}/docker-storage/syncthing:/general" - "${DOCKER_STORAGE_PATH}/syncthing/shares:/shares"
- "${STORAGE_PATH}:/storage"
ports: ports:
- "${SYNCTHING_EXTERNAL_PORT1}:${SYNCTHING_INTERNAL_PORT1}" - "${SYNCTHING_EXTERNAL_PORT1}:${SYNCTHING_INTERNAL_PORT1}"
- "${SYNCTHING_EXTERNAL_PORT2}:${SYNCTHING_INTERNAL_PORT2}" - "${SYNCTHING_EXTERNAL_PORT2}:${SYNCTHING_INTERNAL_PORT2}"
@ -399,6 +437,9 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.21 ipv4_address: 192.168.240.21
labels:
caddy: wiki.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams $MEDIAWIKI_INTERNAL_PORT }}"
depends_on: depends_on:
- mariadb - mariadb
ports: ports:
@ -417,6 +458,9 @@ services:
ipv4_address: 192.168.240.22 ipv4_address: 192.168.240.22
ports: ports:
- "${PHOTOPRISM_EXTERNAL_PORT}:${PHOTOPRISM_INTERNAL_PORT}" - "${PHOTOPRISM_EXTERNAL_PORT}:${PHOTOPRISM_INTERNAL_PORT}"
labels:
caddy: photos.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 2342 }}"
depends_on: depends_on:
- mariadb - mariadb
env_file: env_file:
@ -435,6 +479,8 @@ services:
ipv4_address: 192.168.240.23 ipv4_address: 192.168.240.23
ports: ports:
- "${MARIADB_EXTERNAL_PORT}:${MARIADB_INTERNAL_PORT}" - "${MARIADB_EXTERNAL_PORT}:${MARIADB_INTERNAL_PORT}"
environment:
- MARIADB_AUTO_UPGRADE=true
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/mariadb:/config" - "${DOCKER_STORAGE_PATH}/mariadb:/config"
- sockets:/run/mysqld/ - sockets:/run/mysqld/
@ -446,6 +492,9 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.24 ipv4_address: 192.168.240.24
labels:
caddy: baserow.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 80 }}"
depends_on: depends_on:
- postgres - postgres
env_file: env_file:
@ -456,7 +505,7 @@ services:
gitea: gitea:
container_name: gitea container_name: gitea
image: gitea/gitea:1.21.11 image: gitea/gitea:1.24.0
networks: networks:
public: public:
ipv4_address: 192.168.240.26 ipv4_address: 192.168.240.26
@ -465,6 +514,9 @@ services:
ports: ports:
- "${GITEA_WEBUI_EXTERNAL_PORT}:${GITEA_WEBUI_INTERNAL_PORT}" - "${GITEA_WEBUI_EXTERNAL_PORT}:${GITEA_WEBUI_INTERNAL_PORT}"
- "${GITEA_SSH_EXTERNAL_PORT}:${GITEA_SSH_INTERNAL_PORT}" - "${GITEA_SSH_EXTERNAL_PORT}:${GITEA_SSH_INTERNAL_PORT}"
labels:
caddy: git.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams $GITEA_WEBUI_INTERNAL_PORT }}"
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/gitea:/data" - "${DOCKER_STORAGE_PATH}/gitea:/data"
restart: unless-stopped restart: unless-stopped
@ -493,11 +545,14 @@ services:
restart: unless-stopped restart: unless-stopped
linkace: linkace:
image: linkace/linkace:simple image: linkace/linkace:v1.15.4-simple
container_name: linkace container_name: linkace
networks: networks:
public: public:
ipv4_address: 192.168.240.28 ipv4_address: 192.168.240.28
labels:
caddy: bookmarks.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 80 }}"
depends_on: depends_on:
- mariadb - mariadb
- redis - redis
@ -533,18 +588,31 @@ services:
# - public # - public
vaultwarden: vaultwarden:
image: vaultwarden/server:latest image: vaultwarden/server:1.32.1
container_name: vaultwarden container_name: vaultwarden
networks: networks:
public: public:
ipv4_address: 192.168.240.29 ipv4_address: 192.168.240.29
ports: ports:
- "${VAULTWARDEN_EXTERNAL_PORT}:${VAULTWARDEN_INTERNAL_PORT}" - "${VAULTWARDEN_EXTERNAL_PORT}:${VAULTWARDEN_INTERNAL_PORT}"
labels:
caddy: bw.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 80 }}"
env_file:
- ./secrets/vaultwarden.env
environment: environment:
#- PUSH_ENABLED=true - PUSH_ENABLED=true
#- PUSH_INSTALLATION='287eaff9-7be7-4b52-a31d-b09100dc0f5c' # PUSH_INSTALLATION_ID=
#- PUSH_INSTALLATION_KEY='n0xrH7YORuvJk8rqvxB5' # PUSH_INSTALLATION_KEY=
- ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$aWJ2cVRvYUsySkM3M01TMTJJMnZqbUF0Wm1qRWhvd1B6Sk50Q1hwck96dz0$$FKjZ36E54pX2e0AE9OaDpiH43TyAyfVwr3IvracbqEA - PUSH_RELAY_URI=https://api.bitwarden.eu
- PUSH_IDENTITY_URI=https://identity.bitwarden.eu
- ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$aWJ2cVRvYUsySkM3M01TMTJJMnZqbUF0Wm1qRWhvd1B6Sk50Q1hwck96dz0$$FKjZ36E54pX2e0AE9OaDpiH43TyAyfVwr3IvracbqEA
- SMTP_HOST=${EMAIL_HOST}
- SMTP_FROM=${EMAIL_FROM}
- SMTP_FROM_NAME="Bitwarden (bw.kucharczyk.xyz)"
- SMTP_PORT=${EMAIL_PORT}
- SMTP_USERNAME=${EMAIL_FROM}
- SMTP_PASSWORD=${EMAIL_PASSWORD}
volumes: volumes:
- ${DOCKER_STORAGE_PATH}/vaultwarden:/data - ${DOCKER_STORAGE_PATH}/vaultwarden:/data
restart: unless-stopped restart: unless-stopped

View File

@ -1,2 +0,0 @@
KAVITA_INTERNAL_PORT=5000
KAVITA_EXTERNAL_PORT=5100

View File

@ -2,7 +2,7 @@ ND_LASTFM_APIKEY=29e22ee836a0cb51cfaacb72d605e30d
ND_LASTFM_SECRET=10aa58294eeffa142685e78a0cd78ad6 ND_LASTFM_SECRET=10aa58294eeffa142685e78a0cd78ad6
ND_SPOTIFY_ID=9d6a1b14a4134df5b4447fa46c4bf275 ND_SPOTIFY_ID=9d6a1b14a4134df5b4447fa46c4bf275
ND_SPOTIFY_SECRET=27aed3e91dc34d7593d99ad4febea939 ND_SPOTIFY_SECRET=27aed3e91dc34d7593d99ad4febea939
ND_DEVACTIVITYPANEL=false ND_DEVACTIVITYPANEL=true
ND_SEARCHFULLSTRING=true ND_SEARCHFULLSTRING=true
ND_ENABLESHARING=true ND_ENABLESHARING=true
ND_LOGLEVEL=error ND_LOGLEVEL=error

View File

@ -1,9 +0,0 @@
This folder contains the configuration file, template, and script to generate a Caddyfile for all the services in main repository.
# Usage
1. Run the script:
```bash
./add --config sites-config.yaml --template template.j2 > sites-enabled/generated.caddy
```
2. Reload Caddy with `caddy reload -c /etc/caddy/Caddyfile`

View File

@ -1,76 +0,0 @@
#!/usr/bin/python3
import argparse
import yaml
from jinja2 import Template
def render_template(template_path, **kwargs):
with open(template_path, "r") as file:
template = Template(file.read())
output = template.render(**kwargs)
return output
def format_subdomain(subdomains, domain):
if isinstance(subdomains, list):
return ", ".join([f"{sub}.{domain}" for sub in subdomains])
else:
return f"{subdomains}.{domain}"
def process_sites_config(config_path, template_path, check_mode):
with open(config_path, "r") as file:
sites_config = yaml.safe_load(file)
default_domain = sites_config.get("default_domain", None)
if default_domain is None:
raise ValueError("YAML configuration is missing default_domain key")
total_sites = len(sites_config["sites"])
enabled_sites = 0
disabled_sites = 0
for site in sites_config["sites"]:
domain = site.get("domain", default_domain)
# Check if site is enabled
if site.get("enabled", True): # Default to True if 'enabled' key is not present
enabled_sites += 1
if "subdomain" in site:
site["subdomain"] = format_subdomain(site["subdomain"], domain)
if not check_mode:
rendered_content = render_template(template_path, **site)
print(f"{rendered_content}\n")
else:
disabled_sites += 1
if check_mode:
print(f"Total sites: {total_sites}")
print(f"Enabled sites: {enabled_sites}")
print(f"Disabled sites: {disabled_sites}")
def main():
parser = argparse.ArgumentParser(
description="Process a sites configuration file for Caddyfiles"
)
parser.add_argument(
"--config", required=True, help="Path to the YAML configuration file"
)
parser.add_argument(
"--check",
action="store_true",
help="Only check statistics, do not output templates",
)
parser.add_argument("--template", help="Path to the Jinja2 template file")
args = parser.parse_args()
if args.template is None and args.check is False:
parser.error("--template argument is required if not using --check")
template_path = args.template # Replace with the actual path to your template file
process_sites_config(args.config, template_path, args.check)
if __name__ == "__main__":
main()

View File

@ -1,114 +0,0 @@
sites:
- hostname: gitea
subdomain: git
port: 3000
- hostname: rtorrent
subdomain: torrent
port: 9080
- subdomain: portainer
# fixme: move portainer to docker-compose.yml
# hostname: portainer
hostname: 192.168.0.106
port: 9000
- subdomain: radarr
hostname: radarr
port: 7878
- subdomain: sonarr-tv
hostname: sonarr_tv
port: 8989
- subdomain: sonarr-anime
hostname: sonarr_anime
port: 8989
- subdomain: notify
hostname: ntfy
port: 80
additional_config: |
@httpget {
protocol http
method GET
path_regexp ^/([-_a-z0-9]{0,64}$|docs/|static/)
}
redir @httpget https://{host}{uri}
- subdomain: recipes
hostname: mealie
port: 80
- subdomain: music
hostname: navidrome
port: 4533
- subdomain: paperless
hostname: paperless-ngx
port: 8000
- subdomain: photos
hostname: photoprism
port: 2342
- subdomain: bookmarks
hostname: linkace
port: 80
- subdomain: bw
hostname: vaultwarden
port: 80
- subdomain: drone
# fixme: move to docker compose & change hostname AND PORT!! (80)
# hostname: drone
hostname: 192.168.0.106
port: 580
- subdomain: jellyfin
hostname: jellyfin
port: 8096
- subdomain: comic
hostname: komga
port: 25600
- subdomain: miniflux
hostname: miniflux
port: 8080
- subdomain: netboot
# fixme: move to compose
# hostname: netbootxyz
hostname: 192.168.0.106
port: 3001
- subdomain: cloud
# fixme: move to compose
# hostname: nextcloud
hostname: 192.168.0.106
port: 8484
additional_config: |
redir /.well-known/carddav /remote.php/dav 301
redir /.well-known/caldav /remote.php/dav 301
header Strict-Transport-Security "max-age=15552000; includeSubDomains"
- subdomain: registry
# fixme: move to compose
# hostname: registry
hostname: 192.168.0.106
port: 5000
- subdomain: tracker
hostname: timetracker
port: 8001
additional_config: |
handle_path /static/* {
root * /srv/timetracker
file_server
}
handle /robots.txt {
root * /srv/timetracker
file_server
}
- subdomain: notes-old
additional_config: |
root * /srv/notes
file_server
- subdomain: notes
additional_config: |
reverse_proxy https://publish.obsidian.md {
header_up Host {upstream_hostport}
}
rewrite * /serve?url=notes.kucharczyk.xyz{path}
server_config: |
encode zstd gzip
- subdomain: wiki
hostname: mediawiki
port: 80
- subdomain: baserow
hostname: baserow
port: 80

View File

@ -1,17 +0,0 @@
{{ subdomain }} {
handle {
{% if reverse_proxy_config %}
reverse_proxy {{ hostname }}:{{ port }} {
{{ reverse_proxy_config }}
}
{% else %}
{% if hostname and port %}
reverse_proxy {{ hostname }}:{{ port }}
{% endif %}
{% endif %}
{% if additional_config %}
{{ additional_config }}
{% endif %}
}
{{ server_config }}
}

BIN
secrets/protonvpn.env Normal file

Binary file not shown.

BIN
secrets/vaultwarden.env Normal file

Binary file not shown.

51
services/7dtdserver.yml Normal file
View File

@ -0,0 +1,51 @@
---
services:
7dtdserver:
image: vinanrra/7dtd-server
container_name: 7dtdserver
environment:
- PUID=${PUID}
- PGID=${PGID}
- START_MODE=1 # Change between START MODES
- VERSION=stable # Change between 7 days to die versions
- TimeZone=Europe/Prague # Optional - Change Timezone
- TEST_ALERT=NO # Optional - Send a test alert
- UPDATE_MODS=NO # Optional - This will allow mods to be update on start, each mod also need to have XXXX_UPDATE=YES to update on start
- MODS_URLS="" # Optional - Mods urls to install, must be ZIP or RAR.
- ALLOC_FIXES=NO # Optional - Install ALLOC FIXES
- ALLOC_FIXES_UPDATE=NO # Optional - Update Allocs Fixes before server start
- UNDEAD_LEGACY=NO # Optional - Install Undead Legacy mod, if DARKNESS_FALLS it's enable will not install anything
- UNDEAD_LEGACY_VERSION=stable # Optional - Undead Legacy version
- UNDEAD_LEGACY_UPDATE=NO # Optional - Update Undead Legacy mod before server start
- DARKNESS_FALLS=NO # Optional - Install Darkness Falls mod, if UNDEAD_LEGACY it's enable will not install anything
- DARKNESS_FALLS_UPDATE=NO # Optional - Update Darkness Falls mod before server start
- DARKNESS_FALLS_URL=False # Optional - Install the provided Darkness Falls url
- CPM=NO # Optional - CSMM Patron's Mod (CPM)
- CPM_UPDATE=NO # Optional - Update CPM before server start
- BEPINEX=NO # Optional - BepInEx
- BEPINEX_UPDATE=NO # Optional - Update BepInEx before server start
- BACKUP=NO # Optional - Backup server
- BACKUP_HOUR=5 # Optional - Backup hour 0-23
- BACKUP_MAX=7 # Optional - Max backups to keep
- MONITOR=NO # Optional - Keeps server up if crash
volumes:
- "${DOCKER_STORAGE_PATH}/7daystodie/7DaysToDie:/home/sdtdserver/.local/share/7DaysToDie/" # 7 Days To Die world saves
- "${DOCKER_STORAGE_PATH}/7daystodie/LGSM-Config:/home/sdtdserver/lgsm/config-lgsm/sdtdserver" # LGSM config folder
- "${DOCKER_STORAGE_PATH}/7daystodie/ServerFiles:/home/sdtdserver/serverfiles/" # Optional - serverfiles folder
- "${DOCKER_STORAGE_PATH}/7daystodie/log:/home/sdtdserver/log/" # Optional - Logs folder
- "${DOCKER_STORAGE_PATH}/7daystodie/backups:/home/sdtdserver/lgsm/backup/" # Optional - If BACKUP=NO, backups folder
networks:
public:
ipv4_address: 192.168.240.12
ports:
- 26900:26900/tcp # Default game ports
- 26900:26900/udp # Default game ports
- 26901:26901/udp # Default game ports
- 26902:26902/udp # Default game ports
- 8085:8080/tcp # OPTIONAL - WEBADMIN
- 8086:8081/tcp # OPTIONAL - TELNET
- 8087:8082/tcp # OPTIONAL - WEBSERVER https://7dtd.illy.bz/wiki/Server%20fixes
restart: unless-stopped # INFO - NEVER USE WITH START_MODE=4 or START_MODE=0

17
services/calibre-web.yml Normal file
View File

@ -0,0 +1,17 @@
---
services:
calibre-web:
image: docker.io/linuxserver/calibre-web:0.6.24
container_name: calibre-web
ports:
- 8089:8083
networks:
public:
ipv4_address: 192.168.240.52
environment:
- PUID=${PUID}
- PGID=${PGID}
volumes:
- "${DOCKER_STORAGE_PATH}/calibre-web:/config"
- "${DOCKER_STORAGE_PATH}/syncthing/shares/Calibre Library:/books"
restart: unless-stopped

View File

@ -6,6 +6,9 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.47 ipv4_address: 192.168.240.47
labels:
caddy: drone.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 80 }}"
volumes: volumes:
- ${DOCKER_STORAGE_PATH}/drone:/data - ${DOCKER_STORAGE_PATH}/drone:/data
env_file: env_file:

35
services/gluetun.yml Normal file
View File

@ -0,0 +1,35 @@
---
services:
gluetun:
image: qmcgaw/gluetun
container_name: gluetun-japan
# line above must be uncommented to allow external containers to connect.
# See https://github.com/qdm12/gluetun-wiki/blob/main/setup/connect-a-container-to-gluetun.md#external-container-to-gluetun
cap_add:
- NET_ADMIN
networks:
public:
ipv4_address: 192.168.240.49
devices:
- /dev/net/tun:/dev/net/tun
ports:
- 8888:8888/tcp # HTTP proxy
- 8388:8388/tcp # Shadowsocks
- 8388:8388/udp # Shadowsocks
volumes:
- "${DOCKER_STORAGE_PATH}/gluetun:/gluetun"
env_file:
- ../secrets/protonvpn.env
environment:
# See https://github.com/qdm12/gluetun-wiki/tree/main/setup#setup
- VPN_SERVICE_PROVIDER=protonvpn
- VPN_TYPE=openvpn
# OpenVPN:
# - OPENVPN_USER=
# - OPENVPN_PASSWORD=
- TZ=${TZ}
- SERVER_COUNTRIES=Japan
- HTTPPROXY=on
# Server list updater
# See https://github.com/qdm12/gluetun-wiki/blob/main/setup/servers.md#update-the-vpn-servers-list
- UPDATER_PERIOD=

View File

@ -0,0 +1,15 @@
---
services:
handbrake-server:
image: ghcr.io/thenickoftime/handbrake-web-server:0.7.3
container_name: handbrake-server
user: 1000:100 # edit to run as user (uuid:guid) with permissions to access your media. 0:0 to run as root (not recommended).
networks:
public:
ipv4_address: 192.168.240.50
ports:
- "${HANDBRAKER_SERVER_EXTERNAL_PORT}:${HANDBRAKER_SERVER_INTERNAL_PORT}"
volumes:
- "${DOCKER_STORAGE_PATH}/handbrake-server/data:/data"
- "${STORAGE_PATH}:/video"
restart: unless-stopped

View File

@ -1,7 +1,7 @@
--- ---
services: services:
jellyfin: jellyfin:
image: linuxserver/jellyfin:latest image: linuxserver/jellyfin:10.10.7
container_name: jellyfin container_name: jellyfin
ports: ports:
- "8096:8096" - "8096:8096"
@ -10,6 +10,9 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.32 ipv4_address: 192.168.240.32
labels:
caddy: jellyfin.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 8096 }}"
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/jellyfin:/config" - "${DOCKER_STORAGE_PATH}/jellyfin:/config"
- "${MEDIA_PATH}:/data/media" - "${MEDIA_PATH}:/data/media"

21
services/kavita.yml Normal file
View File

@ -0,0 +1,21 @@
---
services:
kavita:
image: ghcr.io/kareadita/kavita:0.8.5
container_name: kavita
networks:
public:
ipv4_address: 192.168.240.53
ports:
- ${KAVITA_EXTERNAL_PORT}:${KAVITA_INTERNAL_PORT}
labels:
caddy: kavita.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams $KAVITA_INTERNAL_PORT }}"
environment:
- DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true
volumes:
- "${STORAGE_PATH}/media/comics:/comics"
- "${STORAGE_PATH}/media/comics/manga:/manga"
- "${STORAGE_PATH}/media/comics/books:/books"
- "${DOCKER_STORAGE_PATH}/kavita:/kavita/config"
restart: unless-stopped

View File

@ -1,13 +1,16 @@
--- ---
services: services:
komga: komga:
image: gotson/komga:latest image: gotson/komga:1.20.0
container_name: komga container_name: komga
ports:
- "6080:25600"
networks: networks:
public: public:
ipv4_address: 192.168.240.34 ipv4_address: 192.168.240.34
ports:
- "25600:25600"
labels:
caddy: comic.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 25600 }}"
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/komga:/config" - "${DOCKER_STORAGE_PATH}/komga:/config"
- "${COMIC_PATH}:/data" - "${COMIC_PATH}:/data"

View File

@ -3,11 +3,12 @@ services:
miniflux: miniflux:
image: miniflux/miniflux:latest image: miniflux/miniflux:latest
container_name: miniflux container_name: miniflux
ports:
- "8282:8080"
networks: networks:
public: public:
ipv4_address: 192.168.240.35 ipv4_address: 192.168.240.35
labels:
caddy: miniflux.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 8080 }}"
environment: environment:
- BASE_URL=https://miniflux.${DOMAIN} - BASE_URL=https://miniflux.${DOMAIN}
- DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres/miniflux?sslmode=disable - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres/miniflux?sslmode=disable

View File

@ -6,6 +6,8 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.44 ipv4_address: 192.168.240.44
ports:
- 3000:3000
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/netbootxyz:/config" - "${DOCKER_STORAGE_PATH}/netbootxyz:/config"
- "${DOCKER_STORAGE_PATH_SLOW}/netbootxyz:/assets" - "${DOCKER_STORAGE_PATH_SLOW}/netbootxyz:/assets"

View File

@ -15,4 +15,10 @@ services:
environment: environment:
# caddy # caddy
- TRUSTED_PROXIES=192.168.240.2 - TRUSTED_PROXIES=192.168.240.2
labels:
caddy: cloud.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 80 }}"
caddy.handle.redir_0: "/.well-known/carddav /remote.php/dav 301"
caddy.handle.redir_1: "/.well-known/caldav /remote.php/dav 301"
caddy.header.Strict-Transport-Security: "max-age=15552000; includeSubDomains"
restart: unless-stopped restart: unless-stopped

View File

@ -1,11 +1,14 @@
--- ---
services: services:
prowlarr: prowlarr:
image: linuxserver/prowlarr:latest # see https://github.com/linuxserver/docker-prowlarr/releases
image: linuxserver/prowlarr:1.27.0.4852-ls94
container_name: prowlarr container_name: prowlarr
networks: networks:
public: public:
ipv4_address: 192.168.240.43 ipv4_address: 192.168.240.43
ports:
- 9696:9696
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/prowlarr:/config" - "${DOCKER_STORAGE_PATH}/prowlarr:/config"
restart: unless-stopped restart: unless-stopped

30
services/redlib.yml Normal file
View File

@ -0,0 +1,30 @@
---
services:
redlib:
image: quay.io/redlib/redlib:latest
restart: unless-stopped
container_name: "redlib"
# exposed via caddy -> doesn't need an external port
user: nobody
read_only: true
security_opt:
- no-new-privileges:true
# - seccomp=seccomp-redlib.json
cap_drop:
- ALL
environment:
- REDLIB_DEFAULT_THEME=dracula;
- REDLIB_DEFAULT_SHOW_NSFW=on;
- REDLIB_DEFAULT_HIDE_AWARDS=on;
- REDLIB_DEFAULT_USE_HLS=on;
- REDLIB_DEFAULT_BLUR_SPOILER=on;
networks:
public:
ipv4_address: 192.168.240.51
labels:
caddy: redlib.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 8080 }}"
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "--tries=1", "http://localhost:8080/settings"]
interval: 5m
timeout: 3s

View File

@ -6,6 +6,11 @@ services:
networks: networks:
public: public:
ipv4_address: 192.168.240.45 ipv4_address: 192.168.240.45
ports:
- 5000:5000
labels:
caddy: registry.${DOMAIN}
caddy.reverse_proxy: "{{ upstreams 5000 }}"
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/registry/data:/var/lib/registry" - "${DOCKER_STORAGE_PATH}/registry/data:/var/lib/registry"
- "${DOCKER_STORAGE_PATH}/registry/config.yml:/etc/docker/registry/config.yml" - "${DOCKER_STORAGE_PATH}/registry/config.yml:/etc/docker/registry/config.yml"

View File

@ -1,7 +1,7 @@
--- ---
services: services:
sabnzbd: sabnzbd:
image: linuxserver/sabnzbd:latest image: linuxserver/sabnzbd:4.5.1
container_name: sabnzbd container_name: sabnzbd
networks: networks:
public: public:
@ -11,6 +11,8 @@ services:
- PGID=100 - PGID=100
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:sabnzbd - DOCKER_MODS=ghcr.io/themepark-dev/theme.park:sabnzbd
- TP_THEME=dracula - TP_THEME=dracula
ports:
- "${SABNZBD_EXTERNAL_PORT}:${SABNZBD_INTERNAL_PORT}"
volumes: volumes:
- "${DOCKER_STORAGE_PATH}/sabnzbd:/config" - "${DOCKER_STORAGE_PATH}/sabnzbd:/config"
- "${DOWNLOADS_PATH}/sabnzbd:/downloads" - "${DOWNLOADS_PATH}/sabnzbd:/downloads"

View File

@ -37,4 +37,4 @@ services:
- "${NZB_DOWNLOADS_PATH}:/downloads" - "${NZB_DOWNLOADS_PATH}:/downloads"
- "${TORRENTS_SEED_PATH}:/seed" - "${TORRENTS_SEED_PATH}:/seed"
- "${TORRENTS_SEED_PATH}/incomplete:/data/incomplete" - "${TORRENTS_SEED_PATH}/incomplete:/data/incomplete"
restart: unless-stopped restart: unless-stopped