🏠 Proxmox Home Server Documentation
Welcome to the official documentation for the 816931.xyz server infrastructure. This guide covers the hybrid cloud/home architecture, networking protocols, service maps, and maintenance procedures.
🏗️ System Architecture
Our infrastructure utilizes a Hybrid Gateway Model, leveraging a public Oracle VPS as a secure entry point to a local Proxmox Virtual Environment (PVE) at https://192.168.0.149:8006/.
1. The Gateway (Oracle VPS)
- Public IP:
161.118.178.176 - SSH User:
ubuntu(Shortcut:ssh vps) - Role: Acts as a reverse proxy and secure entrypoint.
- Mechanism: Caddy (Unified Infrastructure).
- Local Services:
status.816931.xyzandsyncthing.816931.xyzare terminated locally with automatic HTTPS. - Home Services: All other
*.816931.xyztraffic is reverse proxied to the home server (10.0.0.2:443) over WireGuard. - Stealth Services: Certain services like
sta.816931.xyzare proxied to dedicated LXCs without being listed in public dashboards. - Automation: Configuration is automatically generated via Ansible (
deploy_vps_caddy.yml).
- Local Services:
2. The Internal Host (Proxmox)
- Internal IP:
192.168.0.149 - SSH User:
root(Shortcut:ssh proxmox) - Web UI:
https://192.168.0.149:8006/
3. The Bridge (WireGuard & SSH Tunnels)
- Primary Tunnel (VPN): WireGuard connects VPS (
10.0.0.1) to Home LXC 109 (10.0.0.2). - Monitoring Bridge (SSH): A persistent
wud-tunnel.serviceon the Proxmox Host creates reverse SSH tunnels to the VPS.- Path: VPS
127.0.0.1:[2375-2376]-> Proxmox Host -> Internal LXC LAN IPs.
- Path: VPS
3. Home Traffic Controller (Caddy)
- LXC ID: 106 (
192.168.0.129) - Role: Handles SSL (Let's Encrypt DNS-01 via Cloudflare) and internal routing for all Proxmox services.
- Automation: Configuration is automatically generated via Ansible.
4. Infrastructure Automation (Ansible)
- LXC ID: 110 (Management node)
- Tool: Ansible
- Role: Orchestrates the configuration of Caddy (Home & VPS), Gatus, Homepage, and CoreDNS from a single source of truth.
- Source of Truth:
/root/homeserver/ansible/inventory/infrastructure_vars.yml - Primary Playbooks:
deploy_infra.yml: Deploys Home Caddy, Homepage, and CoreDNS.deploy_vps_caddy.yml: Deploys VPS Caddy Gateway.deploy_backups.yml: Manages Proxmox backup jobs.
- Advanced Features: Supports Multi-Container Sidecars and Ansible Vault for encrypted secrets (
secrets.yml).
5. Backup Engine (Syncthing)
- Architecture: Uses a "3-Way Bridge" (iPad/PC ↔ VPS Relay ↔ Home HDD).
- Relay (VPS):
syncthing.816931.xyz(Port 8384). - Home Target:
synchome.816931.xyz(LXC 108, Port 8086). - Storage: Files are synced to
/mnt/external_driveon Proxmox.
🌐 Networking & DNS
Split DNS (CoreDNS)
- LXC ID: 117 (
192.168.0.14) - Role: Sole internal DNS authority (Technitium removed).
- Function:
- Internal: Resolves domain names to the local Caddy IP (
192.168.0.129) for Gigabit speeds. - Automation: Zone file
db.816931.xyzis automatically generated via Ansible based on the global infrastructure variables. - External: Cloudflare uses a Wildcard A Record (
*) pointing all subdomains to the Oracle VPS public IP (161.118.178.176).
- Internal: Resolves domain names to the local Caddy IP (
- Cloudflare Credentials:
- Zone ID:
4046ccfee8a888ec734fb698534aab88 - API Token:
<REDACTED_CLOUDFLARE_TOKEN>(DNS Edit permissions)
- Zone ID:
🚀 Service Inventory
Cloud Hosted (VPS)
| Service | URL | Role |
|---|---|---|
| Gatus | https://status.816931.xyz |
Monitoring as Code status page. |
| Syncthing Relay | https://syncthing.816931.xyz |
24/7 Always-on sync bridge. |
Home Hosted (Proxmox)
| Service | Access Type | LXC/VM ID |
|---|---|---|
| Jellyfin | https://jellyfin.816931.xyz |
Media Server (Docker). |
| Stremio | https://stremio.816931.xyz |
Media LXC (Docker). |
| Syncthing Home | https://synchome.816931.xyz |
Backup Target (Docker 108). |
| JioTV Go | https://jiotv.816931.xyz |
LXC 108 (Docker) |
| Dispatcharr | https://dispatcharr.816931.xyz |
IPTV Manager (Docker). |
| Erugo | https://share.816931.xyz |
File sharing (Docker 108). |
| Homepage | https://homepage.816931.xyz |
Dashboard (Docker 108). |
| Stirling PDF | https://stirlingpdf.816931.xyz |
PDF Tools (Docker 108). |
| Suwayomi | https://suwayomi.816931.xyz |
Manga Server (Docker 108). |
| ConvertX | https://convertx.816931.xyz |
Unit Converter (Docker 108). |
| BentoPDF | https://bentopdf.816931.xyz |
PDF Tools (Docker 108). |
| Paperless-ngx | https://paperless.816931.xyz |
Document Management (Docker 108). |
| Instagram Monitor | https://sta.816931.xyz |
Stealth OSINT (LXC 119). |
| Home Assistant | Internal IP:8123 | Home Automation (VM 100). |
| Nextcloud | Decommissioned | Replaced by Syncthing. |
🔄 Monitoring & Updates
We use Gatus for "Monitoring as Code" and Centralized Update Management via Ansible.
Gatus (Monitoring as Code)
Gatus replaces Uptime Kuma and AutoKuma. It uses a single YAML file to define all monitors.
- Location: VPS (using network_mode: host).
- Port: 8085 (proxied via VPS Caddy to 80/443).
- Config Path: /home/ubuntu/gatus/config/config.yaml on the VPS.
- Automation: Endpoints are automatically generated from the Ansible infrastructure_services list in infrastructure_vars.yml.
- SSL Automation: The VPS Caddy handles SSL termination using Let's Encrypt for status.816931.xyz.
Homepage (Automation)
Homepage provides a centralized dashboard on LXC 108.
- Automation: services.yaml is automatically generated via Ansible.
- Clean State: Any service removed from infrastructure_vars.yml is automatically removed from the dashboard upon the next Ansible run, ensuring no residual entries.
- Grouping: Services are automatically categorized into Core Services, Media, Tools, and Infrastructure based on the infrastructure_vars.yml configuration.
- Duplicate Prevention: When using Ansible automation, Service Discovery should be disabled in settings.yaml to prevent Docker labels from creating redundant entries.
- 🎨 Hybrid Icon Strategy:
- The homepage_services.yaml.j2 template uses extension-based detection.
- Local Icons: If the icon field ends in .png or .svg, it is served locally from /root/services/homepage/config/icons/ (mapped to /icons/filename.png).
- Remote Slugs: If no extension is present, it defaults to the Homarr Dashboard Icons CDN.
- Notable Local Icons:
- jio.png (JioTV Go)
- honey.png (Honey)
- picoshare.png (Used for Erugo)
- mkdocs.png (Documentation)
- Slug Discovery: Search the Homarr metadata.json for slugs. Use curl -I to verify jsDelivr resolution before committing to a remote slug.
Container Organization
All containers on LXC 108 are organized into individual folders:
* Path: /root/services/<service_name>/docker-compose.yml
* Volumes: Persistent data is mapped to ./data/ relative to the compose file.
JioTV Go Auto-Update
Since JioTV Go is built from source, a custom update system is in place:
* Update Script: /root/services/jiotv-go/update.sh
* Schedule: Runs daily at 3:00 AM via crontab.
* Mechanism: Pulls latest code from GitHub (develop branch) and triggers a docker compose up -d --build.
How to Update
Updates are automated via a systemd timer on the Management Node (LXC 110).
- Manual Trigger: cd /root/homeserver/ansible && ansible-playbook -i inventory/hosts.ini playbooks/maintenance.yml --vault-password-file /root/homeserver/.vault_pass
- Schedule: Daily at 03:00 AM.
- Log Location: journalctl -u ansible-maintenance on LXC 110.
🛠️ Maintenance & Troubleshooting
Self-Healing Protocols
The system is configured to auto-recover from tunnel drops:
* WireGuard Watchdog (LXC 109): A cron job (/usr/local/bin/wg-watchdog.sh) pings 10.0.0.1 every 2 minutes. If it fails, it restarts wg-quick@wg0.
* Systemd Resiliency: Restart=always is enabled for critical services with a 10s delay.
Common Connectivity Fixes
- Tunnel is down: Run
systemctl restart wud-tunnelon the Proxmox Host. - SSH Public Key Denied: If the private key is encrypted with a passphrase, the CLI agent cannot connect non-interactively. Use
ssh-addor remove the passphrase (ssh-keygen -p) to allow automation. - DNS Propagation Delays: When adding new subdomains, Uptime Kuma (on VPS) might show them as "Down" due to stale DNS. Use
sudo resolvectl flush-cacheson the VPS and restart the Uptime Kuma container. As a fallback, add the record to the VPS/etc/hosts. - Homepage "Host validation failed": Ensure the
HOMEPAGE_ALLOWED_HOSTSenvironment variable is set to your dashboard domain (e.g.,homepage.816931.xyz). - Homepage Missing Icons:
- Check the slug on
dashboardicons.com. - For custom icons, host them in
/root/services/homepage/config/icons/and map to/app/public/icons/. - Use the label
homepage.icon=/icons/filename.png(explicit path). - Important: Homepage discovery automatically adds
/icons/if you only provide a filename. If you provide/icons/file.png, it becomes/icons/file.pnginternally. Avoid double slashes. - Download Note: Always verify
curled icons with thefilecommand to ensure they aren't HTML error pages.
- Check the slug on
- Homarr 500 Error: Ensure
SECRET_ENCRYPTION_KEYis set in the environment. - LXC Docker not responding: Ensure the
socatbridge is active inside the LXC:systemctl status docker-proxy.
CLI Rules (For AI & Admins)
- Service Paths: Always operate within
/root/services/<app>/when editing compose files. - NEVER use the
&&operator in shell commands; execute them sequentially. - LXC IDs: Always verify actual IPs via
pct listbefore configuring tunnels. - PROXMOX LXC COMMANDS: When executing commands inside an LXC from a remote SSH session,
pct execcan misinterpret arguments. Use the--separator to prevent this and wrap the command inbash -c.- Correct Example:
ssh proxmox 'pct exec 108 -- bash -c "docker ps -a"'
- Correct Example:
Last Updated: February 20, 2026