24 Commits

Author SHA1 Message Date
Bram Veenboer
2a470dc869 Add Readerr 2025-06-27 10:55:26 +02:00
Bram Veenboer
ca0f0b0208 Update home assistant to 2025.3 2025-06-24 15:02:06 +02:00
Bram Veenboer
8727499cc4 Correct Caddy ports for dsmr, esphome and homeassistant 2025-06-17 16:19:00 +02:00
Bram Veenboer
764ebb400a Rename docker-compose.*.yaml to compose*.yaml 2025-06-17 16:06:35 +02:00
Bram Veenboer
ea4b32d2ce Update jellyfin to 10.10.7 2025-06-12 21:20:05 +02:00
Bram Veenboer
90821f7635 Remove trailing / from caddy pathproxy 2025-06-12 21:19:48 +02:00
Bram Veenboer
05107b8b6f Update photoprism to 250426 2025-06-06 20:02:07 +02:00
Bram Veenboer
8189dd70dd Use Caddy as reverse proxy instead of nginx 2025-05-05 11:37:52 +02:00
Bram Veenboer
575675f9b3 Remove unused openvpn configuration 2025-05-05 10:11:38 +02:00
Bram Veenboer
472b0db3b3 Add caddy config files 2025-05-05 10:11:14 +02:00
Bram Veenboer
837a7ec22d Rename .yml to .yaml 2025-05-05 10:11:12 +02:00
Bram Veenboer
b590536512 Add nginx config files 2025-05-04 12:30:35 +02:00
Bram Veenboer
2026160b19 Swtich dns-ad-blocker server 2025-05-04 12:24:46 +02:00
Bram Veenboer
6eca3d5041 Set timezone to Europe/Amsterdam 2025-04-13 09:47:44 +02:00
Bram Veenboer
4d04103ffe Update rsnapshot for updated container interface
A linuxserver/rsnapshot image update without tag update broke compatibility.
2025-04-13 09:47:33 +02:00
Bram Veenboer
f3b465abee Add new seafile 12.0 configuration
'seafile' now comprises two containers: seafile-mysql and seafile-server.
2025-03-29 13:09:35 +01:00
Bram Veenboer
7dc64ba5fd Update AWS keys 2025-03-29 13:08:24 +01:00
Bram Veenboer
f12f5face5 Update photoprism to 250321 2025-03-29 13:07:57 +01:00
Bram Veenboer
7049c23bb4 Fix incorrect path for shuttle in collectd config 2025-01-17 21:10:37 +01:00
Bram Veenboer
5b01ea6e2f Update sonarr to 4.0.12 2025-01-17 21:10:22 +01:00
Bram Veenboer
a45308bcdb Fix nvme0n1 temperature monitoring in collectd 2025-01-17 21:08:41 +01:00
Bram Veenboer
fae7b184e6 Update filebrowser to v2.31.2 2024-12-29 12:34:46 +01:00
Bram Veenboer
f79818bd3e Add sudo again to collectd Dockerfile 2024-12-29 12:29:39 +01:00
Bram Veenboer
75eb03d763 Remove unused power-data-likwid 2024-12-29 12:29:21 +01:00
45 changed files with 427 additions and 183 deletions

4
.env
View File

@@ -1,5 +1,5 @@
AWS_ACCESS_KEY_ID=AKIAY4DUYEBSTECHF6RN
AWS_SECRET_ACCESS_KEY=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
AWS_ACCESS_KEY_ID=AKIAY4DUYEBS7Q5V33PZ
AWS_SECRET_ACCESS_KEY=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
SURFSHARK_USER=DezwAucfnHhCBAUgkQxysWNk
SURFSHARK_PASSWORD=f8gXqZQQRfpBEMjvgS3H7mKd

41
caddy/Caddyfile Normal file
View File

@@ -0,0 +1,41 @@
(unprotected) {
{args[0]}.{$SUBDOMAIN}.{$DOMAIN} {
log {
output file /var/log/{args[0]}.log
}
reverse_proxy {args[1]}
}
}
(pathproxy) {
handle /{args[0]}* {
reverse_proxy http://{args[1]}
}
}
import unprotected seafile host:8082
import unprotected grafana host:3333
import unprotected photoprism host:2342
import unprotected dsmr host:8888
import unprotected esp host:6052
import unprotected ha host:8123
{$SUBDOMAIN}.{$DOMAIN} {
log {
output file /var/log/path.log
}
import pathproxy jellyfin host:8097
import pathproxy transmission host:9091
import pathproxy sonarr host:18989
import pathproxy radarr host:17878
import pathproxy readarr host:18787
import pathproxy lidarr host:18686
import pathproxy bazarr host:16767
import pathproxy facette host:12003
import pathproxy gitlab host:19080
import pathproxy filebrowser host:8001
import pathproxy plik host:8087
import pathproxy droppy host:19898
import pathproxy ghost host:2368
import pathproxy jackett host:9117
}

8
caddy/Dockerfile Normal file
View File

@@ -0,0 +1,8 @@
FROM caddy:2.7-builder AS builder
RUN xcaddy build \
--with github.com/caddy-dns/route53
FROM caddy:2.7-alpine
COPY --from=builder /usr/bin/caddy /usr/bin/caddy

View File

@@ -29,6 +29,9 @@ ENV PATH="$PATH:/opt/pmt/bin"
RUN apt -y remove make g++ python3-dev python3-pybind11 cmake
RUN apt autoremove -y
RUN useradd collectd
RUN apt -y install sudo
RUN adduser collectd
RUN usermod -aG sudo collectd
RUN echo 'collectd ALL=(ALL) NOPASSWD:ALL' | sudo tee /etc/sudoers.d/collectd
CMD ["/usr/sbin/collectd", "-f"]

View File

@@ -111,7 +111,7 @@ LoadPlugin smart
<Plugin disk>
Disk "sda"
Disk "sdb"
Disk "nvme0"
Disk "nvme0n1"
IgnoreSelected false
</Plugin>
@@ -123,7 +123,7 @@ LoadPlugin smart
<Plugin "smart">
Disk "sda"
Disk "sdb"
Disk "nvme0"
Disk "nvme0n1"
IgnoreSelected false
</Plugin>

View File

@@ -1,77 +0,0 @@
#!/usr/bin/python3
#
# Imports
#
import sys
import time
import argparse
import pylikwid
#
# Configuration
#
hostname = "server"
cpuid = 0
pinfo = pylikwid.getpowerinfo()
domainid = pinfo.get("domains").get("PKG").get("ID")
measurement_duration = 5
measurement_interval = 15
dinfo = pinfo.get("domains")
domain_names = list(dinfo.keys())
domain_ids = [domain["ID"] for domain in list(dinfo.values())]
#
# Command line arguments
#
parser = argparse.ArgumentParser(description="Get CPU power consumption")
parser.add_argument("-s", action="store_true", help="print in human readable format")
args = parser.parse_args()
human_readable = args.s
#
# Methods
#
def get_power():
start = list()
end = list()
power = list()
for domain_id in domain_ids:
e_start = pylikwid.startpower(cpuid, domain_id)
start.append(e_start)
time.sleep(measurement_duration)
for domain_id in domain_ids:
e_stop = pylikwid.stoppower(cpuid, domain_id)
end.append(e_stop)
for events in zip(start, end, domain_ids):
joules = pylikwid.getpower(events[0], events[1], events[2])
power.append(joules / measurement_duration)
return dict(list(zip(domain_names, power)))
def print_rrd(measurements):
timestamp = int(time.time())
for measurement in list(measurements.items()):
name = measurement[0].lower()
power = measurement[1]
print(
(
"PUTVAL {}/exec-power/gauge-{} {}:{:.1f}".format(
hostname, name, timestamp, power
)
)
)
#
# Main
#
if human_readable:
print(get_power())
else:
while True:
power = get_power()
print_rrd(power)
sys.stdout.flush()
time.sleep(measurement_interval)

View File

@@ -4,7 +4,7 @@ services:
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- TZ=Europe/Amsterdam
image: linuxserver/bazarr:v1.4.2-ls246
ports:
- 16767:6767

View File

@@ -6,14 +6,19 @@ services:
depends_on:
- nginx
environment:
- DOMAIN=veenboer.xyz
- SUBDOMAIN=bram
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:?}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:?}
image: caddy
links:
- nginx
ports:
- 444:443
- 443:443
restart: unless-stopped
volumes:
- /opt/caddy/Caddyfile:/etc/caddy/Caddyfile
- /opt/caddy/data:/data
- /opt/caddy/logs:/var/log
extra_hosts:
- host:192.168.2.150

View File

@@ -5,9 +5,9 @@ services:
- AUTO_UPDATE=1
- BRANCH=master
- DNSCRYPT=1
- DNSCRYPT_PROVIDER_NAME=2.dnscrypt-cert.ns0.dnscrypt.nl
- DNSCRYPT_RESOLVER_ADDR=45.76.35.212
- DNSCRYPT_PROVIDER_KEY=4C84:FB8C:0511:5DFA:5F97:C5ED:0329:1370:C78A:BCD6:4E15:DD53:AB08:DE72:FB84:4ACA
- DNSCRYPT_PROVIDER_NAME=2.dnscrypt-cert.securedns.eu
- DNSCRYPT_RESOLVER_ADDR=146.185.167.43
- DNSCRYPT_PROVIDER_KEY=F49F:2C73:4D62:B686:319E:D07E:6919:433B:2F13:85F4:1EFB:CA2F:176D:590B:2E45:3E86
image: oznu/dns-ad-blocker:latest
ports:
- 192.168.2.151:53:53/udp

View File

@@ -9,6 +9,6 @@ services:
- /opt/facette/etc:/etc/facette
- /opt/facette/var:/var/lib/facette
- /opt/collectd/var:/var/lib/collectd
- /media/scratch/collectd/shuttle/rrd/server:/var/lib/collectd/rrd/shuttle
- /media/scratch/collectd/shuttle/rrd/shuttle:/var/lib/collectd/rrd/shuttle
- /media/scratch/collectd/sepia/rrd/sepia:/var/lib/collectd/rrd/sepia
- /media/scratch/collectd/kratos/rrd/kratos:/var/lib/collectd/rrd/kratos

View File

@@ -1,7 +1,7 @@
services:
filebrowser:
container_name: filebrowser
image: filebrowser/filebrowser:v2.28.0
image: filebrowser/filebrowser:v2.31.2
ports:
- 8001:80
volumes:

View File

@@ -1,7 +1,7 @@
services:
homeassistant:
container_name: homeassistant
image: homeassistant/home-assistant:2024.4.3
image: homeassistant/home-assistant:2025.3
network_mode: host
privileged: true
restart: unless-stopped

View File

@@ -3,7 +3,7 @@ services:
container_name: jellyfin
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
image: linuxserver/jellyfin:10.10.3
image: linuxserver/jellyfin:10.10.7
ports:
- 8097:8097
restart: unless-stopped

View File

@@ -26,7 +26,7 @@ services:
- PHOTOPRISM_DATABASE_DRIVER=sqlite
- PHOTOPRISM_UID=1000
- PHOTOPRISM_GID=1000
image: photoprism/photoprism:231128
image: photoprism/photoprism:250426
ports:
- 2342:2342
restart: unless-stopped

19
compose.readarr.yaml Normal file
View File

@@ -0,0 +1,19 @@
services:
readarr:
container_name: readarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
external_links:
- transmission
extra_hosts:
- transmission:192.168.2.150
image: linuxserver/readarr:develop-0.4.18.2805-ls156
ports:
- 18787:8787
restart: unless-stopped
volumes:
- /opt/readarr:/config
- /media/nubes/downloads:/downloads
- /media/neptune/Books/Epub:/books

11
compose.rsnapshot.yaml Normal file
View File

@@ -0,0 +1,11 @@
services:
rsnapshot:
container_name: rsnapshot
environment:
- TZ=Europe/Amsterdam
image: linuxserver/rsnapshot:1.4.5
restart: unless-stopped
volumes:
- /opt/rsnapshot:/config
- /media/jupiter/rsnapshot:/host/scratch
- /root/.ssh:/root/.ssh:ro

47
compose.seafile.yaml Normal file
View File

@@ -0,0 +1,47 @@
services:
seafile-mysql:
image: mariadb:10.11
container_name: seafile-mysql
ports:
- "13306:3306"
environment:
- MYSQL_ROOT_PASSWORD=ROOT_PASSWORD
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
volumes:
- /opt/seafile/database:/var/lib/mysql
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--connect",
"--mariadbupgrade",
"--innodb_initialized",
]
interval: 20s
start_period: 30s
timeout: 5s
retries: 10
seafile-server:
image: seafileltd/seafile-mc:12.0-latest
container_name: seafile-server
ports:
- "8082:80"
volumes:
- /opt/seafile/server:/shared
- /media/seafile:/shared/seafile/seafile-data
environment:
- DB_HOST=seafile-mysql
- DB_PORT=3306
- DB_ROOT_PASSWD=ROOT_PASSWORD
- DB_PASSWORD=PASSWORD
- TIME_ZONE=Europe/Amsterdam
- INIT_SEAFILE_ADMIN_EMAIL=admin@veenboer.xyz
- INIT_SEAFILE_ADMIN_PASSWORD=asecret
- SEAFILE_SERVER_HOSTNAME=seafile.bram.veenboer.xyz
- SEAFILE_SERVER_PROTOCOL=https
- JWT_PRIVATE_KEY=8LzWzeuQ41z1i8fc1cr1L7Kw80VpTgmT
depends_on:
- seafile-mysql

View File

@@ -9,7 +9,7 @@ services:
- transmission
extra_hosts:
- transmission:192.168.2.150
image: linuxserver/sonarr:4.0.4.1491-ls236
image: linuxserver/sonarr:4.0.12
ports:
- 18989:8989
restart: unless-stopped

47
compose.yaml Normal file
View File

@@ -0,0 +1,47 @@
include:
# Web
- compose.nginx.yaml
- compose.filebrowser.yaml
- compose.caddy.yaml
- compose.ghost.yaml
- compose.lighttpd.yaml
- compose.plik.yaml
# Authentication
- compose.surfshark.yaml
# Download
- compose.transmission.yaml
- compose.jackett.yaml
- compose.radarr.yaml
- compose.readarr.yaml
- compose.sonarr.yaml
- compose.bazarr.yaml
- compose.lidarr.yaml
# Media
- compose.jellyfin.yaml
- compose.photoprism.yaml
# Networking
- compose.dns-ad-blocker.yaml
# Backup
- compose.rsnapshot.yaml
- compose.borgmatic.yaml
# Sensors
- compose.homeassistant.yaml
- compose.esphome.yaml
- compose.collectd.yaml
# Storage
- compose.seafile.yaml
# Database
- compose.influxdb.yaml
- compose.timescaledb.yaml
- compose.grafana.yaml
- compose.dsmrdb.yaml
- compose.dsmr.yaml
- compose.facette.yaml

View File

@@ -1,16 +0,0 @@
services:
openvpn-server:
cap_add:
- NET_ADMIN
container_name: openvpn-server
extra_hosts:
- host:192.168.2.150
image: kylemanna/openvpn:2.4
network_mode: bridge
ports:
- 443:443
privileged: true
restart: unless-stopped
volumes:
- /opt/openvpn-server:/etc/openvpn
- /opt/openvpn-server/logrotate.d/openvpn:/etc/logrotate.d/openvpn

View File

@@ -1,13 +0,0 @@
services:
rsnapshot:
container_name: rsnapshot
image: linuxserver/rsnapshot:1.4.5
restart: unless-stopped
volumes:
- /opt/rsnapshot/etc:/etc/rsnapshot
- /opt/rsnapshot/var/log:/var/log
- /opt/rsnapshot/var/run:/var/run
- /opt/rsnapshot/var/spool:/var/spool
- /opt/rsnapshot/usr:/host/usr
- /media/jupiter/rsnapshot:/host/scratch
- /root/.ssh:/root/.ssh

View File

@@ -1,14 +0,0 @@
services:
seafile:
container_name: seafile
environment:
- MODE=autorun
image: gronis/seafile:10.0.1
ports:
- 8100:8000
- 8180:8080
- 8182:8082
restart: unless-stopped
volumes:
- /opt/seafile:/seafile:rw
- /media/seafile:/seafile/seafile-data:rw

View File

@@ -1,47 +0,0 @@
include:
# Web
- docker-compose.nginx.yml
- docker-compose.filebrowser.yml
- docker-compose.caddy.yml
- docker-compose.ghost.yml
- docker-compose.lighttpd.yml
- docker-compose.plik.yml
# Authentication
- docker-compose.openvpn-server.yml
- docker-compose.surfshark.yml
# Download
- docker-compose.transmission.yml
- docker-compose.jackett.yml
- docker-compose.radarr.yml
- docker-compose.sonarr.yml
- docker-compose.bazarr.yml
- docker-compose.lidarr.yml
# Media
- docker-compose.jellyfin.yml
- docker-compose.photoprism.yml
# Networking
- docker-compose.dns-ad-blocker.yml
# Backup
- docker-compose.rsnapshot.yml
- docker-compose.borgmatic.yml
# Sensors
- docker-compose.homeassistant.yml
- docker-compose.esphome.yml
- docker-compose.collectd.yml
# Storage
- docker-compose.seafile.yml
# Database
- docker-compose.influxdb.yml
- docker-compose.timescaledb.yml
- docker-compose.grafana.yml
- docker-compose.dsmrdb.yml
- docker-compose.dsmr.yml
- docker-compose.facette.yml

View File

@@ -0,0 +1,143 @@
server {
listen 80;
location / {
proxy_pass http://host:80;
include /etc/nginx/conf/proxy.conf;
}
location /transmission {
proxy_pass http://host:9091;
include /etc/nginx/conf/proxy.conf;
}
location /sonarr {
proxy_pass http://host:18989;
include /etc/nginx/conf/proxy.conf;
}
location /radarr {
proxy_pass http://host:17878;
include /etc/nginx/conf/proxy.conf;
}
location /lidarr {
proxy_pass http://host:18686;
include /etc/nginx/conf/proxy.conf;
}
location /bazarr {
proxy_pass http://host:16767;
include /etc/nginx/conf/proxy.conf;
}
location /jellyfin {
proxy_pass http://host:8097;
include /etc/nginx/conf/proxy.conf;
}
location /facette {
proxy_pass http://host:12003;
include /etc/nginx/conf/proxy.conf;
}
location /gitlab {
proxy_pass http://host:19080;
include /etc/nginx/conf/proxy.conf;
}
location /filebrowser {
proxy_pass http://host:8001;
include /etc/nginx/conf/proxy.conf;
}
location /plik {
proxy_pass http://host:8087;
include /etc/nginx/conf/proxy.conf;
}
location /droppy {
rewrite ^/droppy(.*)$ /$1 break;
proxy_pass http://host:19898;
include /etc/nginx/conf/proxy.conf;
}
location /ghost {
proxy_pass http://host:2368;
include /etc/nginx/conf/proxy.conf;
}
location /jackett {
proxy_pass http://host:9117;
include /etc/nginx/conf/proxy.conf;
}
location /dss {
proxy_pass http://host:10001;
include /etc/nginx/conf/proxy.conf;
}
location /pgsql {
proxy_pass http://host:5050;
include /etc/nginx/conf/proxy.conf;
}
location /registry {
proxy_pass http://host:1080;
include /etc/nginx/conf/proxy.conf;
}
}
server { # dsmr
listen 80;
server_name dsmr.bram.veenboer.xyz;
location / {
proxy_pass http://host:8888;
rewrite ^/dsmr(.*)$ $1 break;
include /etc/nginx/conf/proxy.conf;
}
}
server {
# homeassistant
listen 80;
server_name ha.bram.veenboer.xyz;
location / {
proxy_pass http://host:8123;
include /etc/nginx/conf/proxy.conf;
}
}
server { # esphome
listen 80;
server_name esp.bram.veenboer.xyz;
location / {
proxy_pass http://host:6052;
include /etc/nginx/conf/proxy.conf;
}
}
server {
# seafile
listen 80;
server_name seafile.bram.veenboer.xyz;
location / {
proxy_pass http://host:8082;
include /etc/nginx/conf/proxy.conf;
proxy_set_header X-Forwarded-Proto https;
}
#location /seafhttp {
# rewrite ^/seafhttp(.*)$ $1 break;
# proxy_pass http://host:8182;
# include /etc/nginx/conf/proxy.conf;
# proxy_set_header X-Forwarded-Proto https;
# client_max_body_size 0;
#}
#location /seafdav {
# proxy_pass http://host:8180;
# include /etc/nginx/conf/proxy.conf;
#}
}
server { # grafana
listen 80;
server_name grafana.bram.veenboer.xyz;
location / {
proxy_pass http://host:3333;
include /etc/nginx/conf/proxy.conf;
}
}
server { # photoprism
listen 80;
server_name photoprism.bram.veenboer.xyz;
location / {
proxy_pass http://host:2342;
include /etc/nginx/conf/proxy.conf;
}
}

View File

@@ -0,0 +1,10 @@
# Proxy
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
# Websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;

View File

@@ -0,0 +1,21 @@
# Enable SSL
ssl_certificate /host/etc/certs/.bram.veenboer.online/certificate+intermediate.pem;
ssl_certificate_key /host/etc/certs/.bram.veenboer.online/key.pem;
ssl_dhparam /host/etc/certs/.bram.veenboer.online/dh.pem;
# Increased security, from https://cipherli.st/
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver_timeout 5s;
# add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
# Redirect HTTP trafic
error_page 497 https://$host:$server_port$request_uri;

View File

@@ -0,0 +1,20 @@
# Enable SSL
ssl_certificate /host/etc/certs/certificate+intermediate.pem;
ssl_certificate_key /host/etc/certs/key.pem;
ssl_dhparam /host/etc/certs/dh.pem;
# Increased security, from https://cipherli.st/
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
# Redirect HTTP trafic
error_page 497 https://$host:$server_port$request_uri;

View File

@@ -0,0 +1,36 @@
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
client_body_buffer_size 1000M;
client_max_body_size 5000M;
server_tokens off;
error_page 401 403 404 /404.html;
include /etc/nginx/conf.d/*.conf;
}