From 26a7d1eee1ae6e71c411c6b45514bdad697852f3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 24 Nov 2025 15:25:01 +0000 Subject: [PATCH] chore: backup infrastructure configurations [skip ci] --- consul_backup/metadata.json | 2 +- .../nomad/postgres/members/pg-odroid6 | 2 +- .../nomad/postgres/members/pg-odroid7 | 2 +- .../nomad/postgres/members/pg-odroid8 | 2 +- consul_backup/nomad/postgres/members/pg-opti1 | 2 +- consul_backup/nomad/postgres/status | 2 +- .../qbitcheck/connection_monitor/state | 2 +- .../qbitcheck/connection_monitor/vpn | 2 +- nomad_backup/gitea.hcl | 1 - nomad_backup/gonic.hcl | 3 +- nomad_backup/grafana.hcl | 36 ++- nomad_backup/hass.hcl | 159 ++++++------ nomad_backup/immich.hcl | 6 + nomad_backup/minihass.hcl | 6 + nomad_backup/nginx.hcl | 7 +- nomad_backup/nzbget.hcl | 63 ++++- nomad_backup/postgres-15.hcl | 6 + nomad_backup/promtail.hcl | 110 ++++++++- nomad_backup/promtail_backup.hcl | 151 ++++++++++++ nomad_backup/prowlarr.hcl | 23 +- nomad_backup/qbittorrent.hcl | 201 +++++++-------- nomad_backup/radarr.hcl | 2 +- nomad_backup/seaweedfsmaster.hcl | 41 +--- nomad_backup/slskd.hcl | 6 + nomad_backup/sonarr-small.hcl | 136 +++++++++++ nomad_backup/sonarr.hcl | 18 +- nomad_backup/traefik.hcl | 7 + nomad_backup/traefik_backup.hcl | 228 ++++++++++++++++++ nomad_backup/vaultwarden.hcl | 44 +++- nomad_backup/wallabag.hcl | 3 + nomad_backup/wireguard.hcl | 49 ++-- 31 files changed, 1016 insertions(+), 306 deletions(-) create mode 100644 nomad_backup/promtail_backup.hcl create mode 100644 nomad_backup/sonarr-small.hcl create mode 100644 nomad_backup/traefik_backup.hcl diff --git a/consul_backup/metadata.json b/consul_backup/metadata.json index 9ffd8d4..83a9281 100644 --- a/consul_backup/metadata.json +++ b/consul_backup/metadata.json @@ -1,5 +1,5 @@ { - "backup_timestamp": "2025-11-23T02:00:42.913047", + "backup_timestamp": "2025-11-24T15:25:00.879116", "total_keys": 79, "successful_backups": 74, "failed_backups": 5, diff --git a/consul_backup/nomad/postgres/members/pg-odroid6 b/consul_backup/nomad/postgres/members/pg-odroid6 index aea7229..2444b66 100644 --- a/consul_backup/nomad/postgres/members/pg-odroid6 +++ b/consul_backup/nomad/postgres/members/pg-odroid6 @@ -1 +1 @@ -{"conn_url":"postgres://192.168.4.226:5432/postgres","api_url":"http://192.168.4.226:8008/patroni","state":"running","role":"replica","version":"4.0.4","xlog_location":587880588200,"replication_state":"streaming","timeline":248} \ No newline at end of file +{"conn_url":"postgres://192.168.4.226:5432/postgres","api_url":"http://192.168.4.226:8008/patroni","state":"running","role":"replica","version":"4.0.4","xlog_location":589299797968,"replication_state":"streaming","timeline":248} \ No newline at end of file diff --git a/consul_backup/nomad/postgres/members/pg-odroid7 b/consul_backup/nomad/postgres/members/pg-odroid7 index 774d477..6320cf2 100644 --- a/consul_backup/nomad/postgres/members/pg-odroid7 +++ b/consul_backup/nomad/postgres/members/pg-odroid7 @@ -1 +1 @@ -{"conn_url":"postgres://192.168.4.227:5432/postgres","api_url":"http://192.168.4.227:8008/patroni","state":"running","role":"replica","version":"4.0.4","xlog_location":587880560592,"replication_state":"streaming","timeline":248} \ No newline at end of file +{"conn_url":"postgres://192.168.4.227:5432/postgres","api_url":"http://192.168.4.227:8008/patroni","state":"running","role":"replica","version":"4.0.4","xlog_location":589299779856,"replication_state":"streaming","timeline":248} \ No newline at end of file diff --git a/consul_backup/nomad/postgres/members/pg-odroid8 b/consul_backup/nomad/postgres/members/pg-odroid8 index e9bbc66..795b013 100644 --- a/consul_backup/nomad/postgres/members/pg-odroid8 +++ b/consul_backup/nomad/postgres/members/pg-odroid8 @@ -1 +1 @@ -{"conn_url":"postgres://192.168.4.228:5432/postgres","api_url":"http://192.168.4.228:8008/patroni","state":"running","role":"primary","version":"4.0.4","xlog_location":587880553712,"timeline":248} \ No newline at end of file +{"conn_url":"postgres://192.168.4.228:5432/postgres","api_url":"http://192.168.4.228:8008/patroni","state":"running","role":"primary","version":"4.0.4","xlog_location":589299779856,"timeline":248} \ No newline at end of file diff --git a/consul_backup/nomad/postgres/members/pg-opti1 b/consul_backup/nomad/postgres/members/pg-opti1 index d5c1315..11abb5a 100644 --- a/consul_backup/nomad/postgres/members/pg-opti1 +++ b/consul_backup/nomad/postgres/members/pg-opti1 @@ -1 +1 @@ -{"conn_url":"postgres://192.168.4.36:5432/postgres","api_url":"http://192.168.4.36:8008/patroni","state":"running","role":"replica","version":"4.0.4","xlog_location":587880830616,"replication_state":"streaming","timeline":248} \ No newline at end of file +{"conn_url":"postgres://192.168.4.36:5432/postgres","api_url":"http://192.168.4.36:8008/patroni","state":"running","role":"replica","version":"4.0.4","xlog_location":589299713952,"replication_state":"streaming","timeline":248} \ No newline at end of file diff --git a/consul_backup/nomad/postgres/status b/consul_backup/nomad/postgres/status index 5ad23cc..b1325dc 100644 --- a/consul_backup/nomad/postgres/status +++ b/consul_backup/nomad/postgres/status @@ -1 +1 @@ -{"optime":587880553712,"slots":{"pg_odroid6":587880553712,"pg_odroid7":587880553712,"pg_opti1":587880553712,"pg_odroid8":587880553712},"retain_slots":["pg_odroid6","pg_odroid7","pg_odroid8","pg_opti1"]} \ No newline at end of file +{"optime":589299779856,"slots":{"pg_odroid6":589299779856,"pg_odroid7":589299779856,"pg_opti1":589299779856,"pg_odroid8":589299779856},"retain_slots":["pg_odroid6","pg_odroid7","pg_odroid8","pg_opti1"]} \ No newline at end of file diff --git a/consul_backup/qbitcheck/connection_monitor/state b/consul_backup/qbitcheck/connection_monitor/state index 4059104..1bbf7ea 100644 --- a/consul_backup/qbitcheck/connection_monitor/state +++ b/consul_backup/qbitcheck/connection_monitor/state @@ -1 +1 @@ -{"connection_state": "stable", "last_state_change_time": 1763829844.4920733, "consecutive_failures": 21, "consecutive_stable_checks": 122, "last_failure_time": 1763829749.067393} \ No newline at end of file +{"connection_state": "unstable", "last_state_change_time": 1763997771.3138738, "consecutive_failures": 0, "consecutive_stable_checks": 0, "last_failure_time": 1763829749.067393} \ No newline at end of file diff --git a/consul_backup/qbitcheck/connection_monitor/vpn b/consul_backup/qbitcheck/connection_monitor/vpn index 9ffd145..44de8f6 100644 --- a/consul_backup/qbitcheck/connection_monitor/vpn +++ b/consul_backup/qbitcheck/connection_monitor/vpn @@ -1 +1 @@ -{"vpn_status": "running", "last_vpn_status_change": 1763829147.0930555, "public_ip": "192.30.89.67", "last_public_ip_change": 1763829147.2012818, "public_ip_details": {"public_ip": "192.30.89.67", "region": "British Columbia", "country": "Canada", "city": "Vancouver", "location": "49.2497,-123.1193", "organization": "AS394256 Tech Futures Interactive Inc.", "postal_code": "V5Y", "timezone": "America/Vancouver"}} \ No newline at end of file +{"vpn_status": "running", "last_vpn_status_change": 1763829147.0930555, "public_ip": "139.28.218.235", "last_public_ip_change": 1763997771.0223732, "public_ip_details": {"public_ip": "139.28.218.235", "region": "Quebec", "country": "Canada", "city": "Montreal", "location": "45.499401,-73.570297", "organization": "M247 Europe SRL", "postal_code": "H3B", "timezone": "America/Toronto"}} \ No newline at end of file diff --git a/nomad_backup/gitea.hcl b/nomad_backup/gitea.hcl index b298906..66254a7 100644 --- a/nomad_backup/gitea.hcl +++ b/nomad_backup/gitea.hcl @@ -68,7 +68,6 @@ job "gitea" { GITEA__server__SSH_PORT = "${NOMAD_HOST_PORT_ssh}" # The port exposed on the host for SSH GITEA__actions__ENABLED=true - GITEA__packages__ENABLED=true # Set the user Gitea runs as inside the container (important for permissions) USER_UID = "1000" diff --git a/nomad_backup/gonic.hcl b/nomad_backup/gonic.hcl index 413a1ca..d45a4e0 100644 --- a/nomad_backup/gonic.hcl +++ b/nomad_backup/gonic.hcl @@ -48,6 +48,7 @@ job "gonic" { "traefik.http.routers.goniclan.rule=Host(`gonic.service.dc1.consul`)", "traefik.http.routers.gonicwan.rule=Host(`mg.fbleagh.duckdns.org`)", "traefik.http.routers.gonicwan.tls=true", + "traefik.http.routers.gonicwan.tls.certresolver=myresolver" ] // "traefik.http.middlewares.gonic_auth.basicauth.users=admin:$2y$05$cJGONoS0BFTeBUXqmETikeI14QhLDKIDkYuPdA1umIOC129grVMAm", @@ -147,4 +148,4 @@ dbs: } -} +} \ No newline at end of file diff --git a/nomad_backup/grafana.hcl b/nomad_backup/grafana.hcl index f146812..0801398 100644 --- a/nomad_backup/grafana.hcl +++ b/nomad_backup/grafana.hcl @@ -2,7 +2,9 @@ job "grafana" { # region = "global" datacenters = ["dc1"] type = "service" + # priority = 50 + constraint { attribute = "${attr.kernel.name}" value = "linux" @@ -19,23 +21,29 @@ job "grafana" { } group "grafana" { count = 1 + restart { attempts = 2 interval = "1m" delay = "10s" mode = "delay" } + task "grafana" { driver = "docker" + config { // image = "fg2it/grafana-armhf:v5.1.4" image = "grafana/grafana:latest" ports = ["http"] + logging { type = "json-file" } + memory_hard_limit = 2048 } + env { disable_login_form = "EST5EDT" PUID = 1000 @@ -45,28 +53,25 @@ job "grafana" { GF_AUTH_ANONYMOUS_ORG_NAME = "Main Org." GF_AUTH_ANONYMOUS_ORG_ROLE = "Admin" } + template { data = <(.*)' /config/config.xml | sed -e 's/<[^>]*>//g')" + EOH + + destination = "local/healthcheck.sh" + perms = "0755" + } + + template { + data = "---\nkey: {{ key \"ovpn-client\" }}" + destination = "local/file.yml" + change_mode = "restart" + } + + env { + // SHARE = "Public;/mount/Public;yes;no;yes;all;none;;Public" + # GLOBAL = "socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536" + # PERMISSIONS = "true" + # WORKGROUP = "WORKGROUP" + TZ = "EST5EDT" + + PUID = 1000 + PGID = 1000 + } + + # We must specify the resources required for + # this task to ensure it runs on a machine with + # enough capacity. + resources { + cpu = 500 # 500 MHz + memory = 256 # 128MB + } + + # Specify configuration related to log rotation + logs { + max_files = 10 + max_file_size = 15 + } + + # Controls the timeout between signalling a task it will be killed + # and killing the task. If not set a default is used. + kill_timeout = "10s" + } #End main task + + network { + // mbits = 100 + + port "http" { + static = 8989 + to = 8989 + } + } + } +} diff --git a/nomad_backup/sonarr.hcl b/nomad_backup/sonarr.hcl index b2fa4a3..21a365b 100644 --- a/nomad_backup/sonarr.hcl +++ b/nomad_backup/sonarr.hcl @@ -8,12 +8,7 @@ job "sonarr" { attribute = "${attr.kernel.name}" value = "linux" } - constraint { - attribute = "${attr.cpu.arch}" - operator = "regexp" - value = "amd64" - } - + update { stagger = "10s" max_parallel = 1 @@ -34,23 +29,18 @@ job "sonarr" { driver = "docker" config { - image = "linuxserver/sonarr:develop" + image = "lscr.io/linuxserver/sonarr:develop" ports = ["http"] - - // dns_servers = ["192.168.1.1", "1.1.1.1"] + dns_servers = ["${attr.unique.network.ip-address}","192.168.4.250","8.8.8.8"] memory_hard_limit = "2048" - // cpuset_cpus = "4-7" volumes = [ "/mnt/Public/Downloads/news:/downloads", "/mnt/Public/Downloads/tv:/tv", - // "/mnt/configs/sonarr:/config", "/mnt/Public/configs/sonarr_pg:/config", - // "local/config.xml:/config/config.xml" ] - // "/mnt/gv0/sonarr:/config", force_pull = false } @@ -137,7 +127,7 @@ job "sonarr" { # Specify configuration related to log rotation logs { - max_files = 12 + max_files = 10 max_file_size = 15 } diff --git a/nomad_backup/traefik.hcl b/nomad_backup/traefik.hcl index 4c07e8e..26cf9b7 100644 --- a/nomad_backup/traefik.hcl +++ b/nomad_backup/traefik.hcl @@ -1,4 +1,11 @@ job "traefik" { + node_pool = "default" + constraint { + attribute = "${attr.cpu.arch}" + operator = "!=" + value = "arm" + } + datacenters = ["dc1"] type = "system" diff --git a/nomad_backup/traefik_backup.hcl b/nomad_backup/traefik_backup.hcl new file mode 100644 index 0000000..a949f99 --- /dev/null +++ b/nomad_backup/traefik_backup.hcl @@ -0,0 +1,228 @@ +job "traefik_backup" { + node_pool = "backup" + + datacenters = ["dc1"] + type = "system" + + constraint { + attribute = "${attr.kernel.name}" + value = "linux" + } + + update { + stagger = "10s" + max_parallel = 1 + healthy_deadline = "5m" + } + + group "traefik" { + count = 1 + + restart { + attempts = 6 + interval = "1m" + delay = "10s" + mode = "delay" + } + + task "traefik" { + driver = "docker" + + config { + image = "traefik:2.9" + // network_mode = "host" + + args = [ + // "--api.dashboard", + // "--providers.consulcatalog.defaultRule=Host(`{{ .Name }}.service.dc1.consul`)", + // "--providers.consulcatalog.endpoint.address=${attr.unique.network.ip-address}:8500", + // "--providers.consulcatalog.exposedbydefault=true", + // "--metrics=true", + // "--metrics.prometheus=true", + // "--metrics.prometheus.entryPoint=web", + // "--entryPoints.web.address=:80", + // "--entryPoints.websecure.address=:443", + // "--entryPoints.openvpn.address=:1194/udp", + "--configFile=/local/file.yml", + // "--certificatesresolvers.myresolver.acme.email=stuart.stent@gmail.com", + // "--certificatesresolvers.myresolver.acme.storage=/acmecert/acme.json", + // "--certificatesresolvers.myresolver.acme.tlschallenge=true", + // "--certificatesresolvers.myresolver-int.acme.email=stuart.stent@gmail.com", + // "--certificatesresolvers.myresolver-int.acme.storage=/acmecert/acme.json", + // "--certificatesresolvers.myresolver-int.acme.tlschallenge=true", + // "--certificatesresolvers.myresolver-int.acme.dnschallenge=true", + // "--certificatesresolvers.myresolver-int.acme.dnschallenge.provider=duckdns", + "--accesslog=true", + // "--serversTransport.insecureSkipVerify=true", + ] + volumes = [ + "/var/run/docker.sock:/var/run/docker.sock", + "/mnt/mnt/configs/letsencrypt:/acmecert/", + ] + + // dns_servers = ["192.168.4.1", "192.168.4.250"] + ports = ["traefik", "traefikhttps","traefikui"] + + memory_hard_limit = 20480 + } + + env { + TZ = "EST5EDT" + PUID = 1000 + PGID = 1000 + DUCKDNS_TOKEN="e4b5ca33-1f4d-494b-b06d-6dd4600df662" + } + + template { + left_delimiter = "[[" + right_delimiter = "]]" + + data = <