---
title: "Homelab — Full Services Map & Network Reference"
aliases: [homelab-map, services-map, homelab-reference]
tags: [homelab, proxmox, docker, dns, networking, reference]
created: 2026-04-26
updated: 2026-04-26
status: live
---

## Infrastructure — Containers & VMs

| CT/VM | Name | IP | MAC | RAM | Status | Role |
|-------|------|----|-----|-----|--------|------|
| host | pve | 192.168.1.48 | 70:5A:0F:4A:9B:C1 | — | running | Proxmox VE (`ssh pve`) |
| CT102 | docker | 192.168.1.225 | BC:24:11:52:32:9F | 9 GB | running | All Docker services |
| CT105 | immich | 192.168.1.71 | BC:24:11:EA:8F:FD | 8 GB | running | Immich photos (ip=dhcp!) |
| CT111 | media | 192.168.1.230 | BC:24:11:7A:1B:8A | 4 GB | running | Jellyfin + *arr + GPU |
| VM200 | kali-linux | DHCP | BC:24:11:BD:12:10 | 8 GB | stopped | Pentest (start manually) |

**Stopped (destroy after 2026-05-03, backed up to usb-backup):**
CT101 adguard, CT103 beszel, CT104 vaultwarden, CT107 homarr, CT110 uptimekuma

---

## CT102 — Docker Services (192.168.1.225)

| Service | External URL | Internal Port | Config Path |
|---------|-------------|--------------|-------------|
| Nginx Proxy Manager | http://192.168.1.225:81 | :81 | /opt/npm/ |
| Portainer | https://192.168.1.225:9443 | :9443 | Docker volume |
| AdGuard Home | https://dns.ai-impress.com | :8053 / :53 | /opt/services/adguard/ |
| Nextcloud | https://nextcloud.ai-impress.com | :8080 | /opt/nextcloud/ |
| Vaultwarden | https://passwords.ai-impress.com | :8082 | /opt/services/vaultwarden/ |
| Karakeep | https://links.ai-impress.com | :3000 | Docker volume |
| Authentik | https://auth.ai-impress.com | :9001 | /opt/services/authentik/ |
| Homarr | https://home.ai-impress.com | :7575 | /opt/services/homarr/ |
| Uptime Kuma | https://uptime.ai-impress.com | :3001 | /opt/services/uptime-kuma/ |
| Beszel | https://beszel.ai-impress.com | :8090 | /opt/services/beszel/ |
| Dozzle | https://logs.ai-impress.com | :9999 | /opt/services/dozzle/ |
| Ntfy | https://ntfy.ai-impress.com | :2586 | /opt/services/ntfy/ |
| Backrest | https://backup.ai-impress.com | :9898 | /opt/services/backrest/ |
| Paperless-ngx | https://docs.ai-impress.com | :8010 | /opt/services/paperless/ |
| It-tools | https://tools.ai-impress.com | :8880 | /opt/services/it-tools/ |
| Stirling-PDF | https://pdf.ai-impress.com | :8088 | /opt/services/stirling-pdf/ |
| Actual Budget | https://budget.ai-impress.com | :5006 | /opt/services/actual/ |
| Prometheus | http://192.168.1.225:9090 | :9090 | /opt/monitoring/ |
| Alertmanager | http://192.168.1.225:9093 | :9093 | /opt/monitoring/ |
| Loki | — | :3100 | /opt/monitoring/ |
| Diun | — | — | /opt/services/diun/ |
| CrowdSec | — | — | /opt/services/crowdsec/ |

---

## CT105 — Immich (192.168.1.71)

| Service | External URL | Port |
|---------|-------------|------|
| Immich | https://photo.ai-impress.com | :2283 |

**Note:** CT105 uses `ip=dhcp` — DHCP reservation for MAC `BC:24:11:EA:8F:FD → 192.168.1.71` is critical.

---

## CT111 — Media Stack (192.168.1.230)

| Service     | External URL                    | Internal Port | Config Path             |
| ----------- | ------------------------------- | ------------- | ----------------------- |
| Jellyfin    | https://jellyfin.ai-impress.com | :8096         | /opt/media/jellyfin/    |
| Sonarr      | https://sonarr.ai-impress.com   | :8989         | /opt/media/sonarr/      |
| Radarr      | https://radarr.ai-impress.com   | :7878         | /opt/media/radarr/      |
| Prowlarr    | https://prowlarr.ai-impress.com | :9696         | /opt/media/prowlarr/    |
| qBittorrent | https://qbit.ai-impress.com     | :8080         | /opt/media/qbittorrent/ |

**GPU:** Intel HD Graphics 630, QuickSync via `/dev/dri/renderD129` (GID 993)
**Media disk:** 500 GB LVM → `/mnt/media` — unified mount for all containers

---

## DNS Architecture

### Internal (AdGuard Home — CT102 Docker)

```
All *.ai-impress.com → NPM → 192.168.1.225
AdGuard listens on CT102:53 (docker-proxy)
CT102 resolv.conf: 127.0.0.1 + 8.8.8.8
CT105 resolv.conf: 192.168.1.225 + 8.8.8.8
Proxmox host resolv.conf: 192.168.1.225 + 8.8.8.8
```

### External (Cloudflare proxy — public IP 83.151.203.105)

**Working A records:**
- nextcloud.ai-impress.com ✓
- links.ai-impress.com ✓
- photo.ai-impress.com ✓

**Missing — must add in Cloudflare:**
- passwords.ai-impress.com — Vaultwarden (mobile clients need this)
- auth.ai-impress.com — Authentik SSO (required for ForwardAuth to work externally)
- ntfy.ai-impress.com — push notifications to mobile

**Optional external (add if you want remote access):**
- home.ai-impress.com, jellyfin.ai-impress.com, docs.ai-impress.com, budget.ai-impress.com, uptime.ai-impress.com

**Keep internal only (never expose):**
- dns.ai-impress.com, beszel.ai-impress.com, logs.ai-impress.com, tools.ai-impress.com, pdf.ai-impress.com
- sonarr/radarr/prowlarr/qbit.ai-impress.com

---

## Router — Required Changes

### 1. Fix DNS (CRITICAL)
In router DHCP settings → change **Static DNS 1**:
```
Current: 192.168.1.255  ← WRONG (broadcast address!)
Fix:     192.168.1.225  ← CT102 AdGuard
```
DNS 2: `1.1.1.1` is fine as fallback.

### 2. DHCP Reservations to Add

Click **DHCP Reservations** → **Manually add device reservation**:

| Name | IP | MAC |
|------|----|-----|
| pve | 192.168.1.48 | 70:5A:0F:4A:9B:C1 |
| docker | 192.168.1.225 | BC:24:11:52:32:9F |
| immich | 192.168.1.71 | BC:24:11:EA:8F:FD |
| media | 192.168.1.230 | BC:24:11:7A:1B:8A |

> `immich` is the only one using DHCP internally — it WILL change IP on next DHCP renewal without this reservation.

---

## Quick Commands

```bash
# SSH to Proxmox
ssh pve

# Run command in CT102
ssh pve "pct exec 102 -- <cmd>"

# Run command in CT111
ssh pve "pct exec 111 -- <cmd>"

# Restart a service in CT102
ssh pve "pct exec 102 -- bash -c 'cd /opt/services/<name> && docker compose restart'"

# View live logs in CT102
ssh pve "pct exec 102 -- docker logs -f <container>"

# Check all containers
ssh pve "pct exec 102 -- docker ps --format 'table {{.Names}}\t{{.Status}}'"
```

---

## Pending After 2026-05-03

```bash
# Destroy old stopped LXCs
ssh pve "pct destroy 101 && pct destroy 103 && pct destroy 104 && pct destroy 107 && pct destroy 110"

# Remove old scrape targets from Prometheus
# Edit /opt/monitoring/prometheus.yml — remove .62, .104, .171, .212, .224
```
