Skip to content

Services

Core services

Service Purpose
AdGuard Home DNS filtering and rewrites; two synchronized instances
Caddy HTTPS reverse proxy; wildcard certificates via DNS-01
Tailscale Private remote access over a WireGuard mesh; no exposed inbound ports
Prometheus Pulls host and service telemetry
Grafana Dashboards for infrastructure health
Proxmox Backup Server Backup testing; currently evaluated in a test LXC

Hosted applications

Representative workloads on Unraid include a dashboard, Immich photo management, Jellyfin media serving, and additional media automation services. The operational focus is container lifecycle, persistent storage, private access, reverse proxying, monitoring and recovery.

Services use consistent FQDNs such as service.example.net. Internal DNS resolves them to Caddy, and remote mesh clients use the same names through split DNS.

Reverse proxy standard (Caddy)

Caddyfile excerpt:

# /etc/caddy/Caddyfile
{
    acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
    email {env.ACME_EMAIL}
}
adguard.example.net {
    reverse_proxy 192.168.X.X:80
}
grafana.example.net {
    reverse_proxy 192.168.X.X:3000
}
immich.example.net {
    request_body {
        max_size 5GB
    }
    reverse_proxy 192.168.X.X:2283 {
        flush_interval -1
    }
}

Change procedure

caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy
systemctl status caddy --no-pager
  1. Make the smallest required edit.
  2. Validate before reload.
  3. Reload without dropping connections.
  4. Confirm status and test the affected FQDN.
  5. Review recent logs if the health check fails.

Self-signed upstream exception

An upstream with a self-signed certificate may need explicit transport configuration. Keep that exception narrow and documented rather than a global default.

AdGuard Home

Two AdGuard Home instances run with synchronized configuration, which reduces the impact of a single-instance failure. A DNS rewrite maps *.example.net to Caddy, giving each service a consistent name on the LAN and, through split DNS, on the Tailscale mesh. A baseline configuration is stored on Unraid so the DNS service can be rebuilt quickly.

Tailscale

Tailscale provides private remote access over a WireGuard mesh with no exposed inbound ports. Mesh membership is required for remote access, and domain queries traverse the mesh via split DNS.

Monitoring (Prometheus and Grafana)

Node exporters (Unraid and Proxmox) and service endpoints (HTTP and DNS checks) feed Prometheus at a 15-second scrape interval, and Grafana renders the dashboards.

global:
  scrape_interval: 15s
scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['localhost:9090']
  - job_name: infrastructure
    static_configs:
      - targets:
          - '192.168.X.X:9100'   # Unraid exporter
          - '192.168.X.X:9100'   # Proxmox node 1
          - '192.168.X.X:9100'   # Proxmox node 2

Observe: host availability, CPU and memory pressure, storage and filesystem trends, and exporter scrape failures.

Investigate: correlate service errors with host resource changes, separate process failure from application-layer failure, and confirm recovery after a restart or maintenance.

Monitoring is not recovery

Prometheus and Grafana provide visibility. Separate health-check scripts perform bounded remediation and notification; see Automation.