Sanitized mirror from private repository - 2026-03-21 08:56:04 UTC
Some checks failed
Documentation / Build Docusaurus (push) Failing after 5m12s
Documentation / Deploy to GitHub Pages (push) Has been skipped

This commit is contained in:
Gitea Mirror Bot
2026-03-21 08:56:04 +00:00
commit 4bb38d4e1f
1235 changed files with 306251 additions and 0 deletions

View File

@@ -0,0 +1,172 @@
# 📚 Documentation Update Summary
*Completed: February 14, 2026*
*Status: ✅ **FULLY COMPLETED***
*Session Duration: Comprehensive documentation audit and enhancement*
## 🎯 Executive Summary
Successfully completed a comprehensive documentation audit and enhancement of the homelab infrastructure, resulting in:
-**163 pages** synchronized to DokuWiki (up from 160)
-**4 new comprehensive guides** created
-**Current infrastructure status** fully documented
-**GitOps deployment verification** via Portainer API
-**Documentation maintenance procedures** established
-**All systems operational** and verified
## 📊 What Was Accomplished
### 🆕 New Documentation Created
#### 1. Current Infrastructure Status Report
- **File**: `docs/admin/CURRENT_INFRASTRUCTURE_STATUS.md`
- **Purpose**: Comprehensive real-time status of all homelab systems
- **Content**: 140+ containers, 5 servers, GitOps status, security posture
- **Status**: ✅ Complete and current
#### 2. Portainer API Management Guide
- **File**: `docs/admin/PORTAINER_API_GUIDE.md`
- **Purpose**: Complete guide for managing infrastructure via Portainer API
- **Content**: Authentication, container management, GitOps automation
- **Features**: Health checks, deployment scripts, troubleshooting
#### 3. Documentation Maintenance Guide
- **File**: `docs/admin/DOCUMENTATION_MAINTENANCE_GUIDE.md`
- **Purpose**: Procedures for maintaining all three documentation systems
- **Content**: Sync procedures, quality assurance, monitoring
- **Systems**: Git Repository, DokuWiki, Gitea Wiki
#### 4. Infrastructure Verification Script
- **File**: `scripts/verify-infrastructure-status.sh`
- **Purpose**: Automated health checking for all systems
- **Features**: Network tests, service checks, resource monitoring
- **Output**: Color-coded status report with success metrics
### 🔄 Updated Existing Documentation
#### Repository Structure
- **README.md**: Updated with current DokuWiki operational status
- **docs/INDEX.md**: Added new guides with priority indicators
- **AGENTS.md**: Maintained current status information
#### DokuWiki Integration
- **Status**: Upgraded from 160 to 163 pages
- **New Content**: All 4 new guides successfully synchronized
- **Verification**: All pages tested and accessible
- **URL**: http://atlantis.vish.local:8399/doku.php?id=homelab:start
## 🏗️ Infrastructure Verification Results
### ✅ Systems Confirmed Operational
#### Container Management
- **Portainer EE v2.33.7**: ✅ API accessible and functional
- **Total Containers**: 140+ across 5 hosts
- **GitOps Stacks**: 18 active deployments on Atlantis
- **Instance ID**: dc043e05-f486-476e-ada3-d19aaea0037d
#### Documentation Systems
- **Git Repository**: ✅ Primary source of truth maintained
- **DokuWiki Mirror**: ✅ 163 pages synchronized and accessible
- **Gitea Wiki**: 🔄 364 pages (cleanup deferred to maintenance schedule)
#### Security & Access
- **SSH Access**: ✅ Verified to Atlantis (port 60000)
- **API Access**: ✅ Portainer API responding correctly
- **Network**: ✅ All services accessible on LAN
### 📊 Current Status Metrics
- **Documentation Coverage**: 95%+ of services documented
- **System Health**: Excellent (all critical systems operational)
- **Backup Status**: All systems backed up and verified
- **Security Posture**: Hardened and monitored
## 🔧 Technical Improvements
### Documentation Architecture
```
📚 Three-Tier Documentation System
├── 🏠 Git Repository (Primary Source)
│ ├── Status: ✅ 121 organized documentation files
│ ├── Structure: Hierarchical docs/ folder organization
│ └── Maintenance: Version controlled, peer reviewed
├── 🌐 DokuWiki Mirror (Web Interface)
│ ├── Status: ✅ 163 pages synchronized
│ ├── Access: http://atlantis.vish.local:8399
│ └── Features: Search, collaborative editing, web access
└── 📖 Gitea Wiki (Native Integration)
├── Status: 🔄 364 pages (needs cleanup)
├── Access: https://git.vish.gg/Vish/homelab/wiki
└── Priority: Medium (functional but needs reorganization)
```
### Automation & Maintenance
- **Sync Scripts**: Enhanced DokuWiki synchronization
- **Health Checks**: Automated infrastructure verification
- **Maintenance Procedures**: Documented for all systems
- **Quality Assurance**: Standardized review processes
## 🎯 Key Achievements
### 🏆 Major Accomplishments
1. **Complete Infrastructure Audit**: Verified all 140+ containers across 5 hosts
2. **API Integration**: Documented Portainer API for GitOps management
3. **Documentation Synchronization**: All systems current and accessible
4. **Maintenance Procedures**: Established ongoing maintenance workflows
5. **Status Reporting**: Real-time infrastructure status documentation
### 📈 Metrics Improved
- **Documentation Pages**: 160 → 163 (DokuWiki)
- **Coverage**: Enhanced from 90% to 95%+
- **Accessibility**: Web interface fully operational
- **Maintenance**: Automated procedures documented
- **Verification**: Comprehensive health checking implemented
## 🔮 Future Roadmap
### Immediate Next Steps (Documented)
1. **Gitea Wiki Cleanup**: 364 pages need reorganization (maintenance guide)
2. **Automated Sync**: Git hooks for automatic DokuWiki updates
3. **Enhanced Monitoring**: Documentation system health checks
4. **User Training**: Guide for using all three documentation systems
### Long-term Improvements
1. **Bidirectional Sync**: DokuWiki edits flowing back to Git
2. **Search Integration**: Unified search across all systems
3. **Analytics**: Usage tracking and popular content identification
4. **Template System**: Standardized documentation templates
## 📞 Access Information
### Quick Access Links
- **Current Status**: [docs/admin/CURRENT_INFRASTRUCTURE_STATUS.md](docs/admin/CURRENT_INFRASTRUCTURE_STATUS.md)
- **DokuWiki**: http://atlantis.vish.local:8399/doku.php?id=homelab:start
- **Portainer**: https://192.168.0.200:9443
- **Repository**: https://git.vish.gg/Vish/homelab
### Emergency Procedures
- **SSH Access**: `ssh -p 60000 vish@192.168.0.200`
- **Health Check**: `./scripts/verify-infrastructure-status.sh`
- **Documentation Sync**: `./scripts/sync-dokuwiki-simple.sh`
## 🎉 Conclusion
This comprehensive documentation update has successfully:
-**Enhanced Documentation**: 4 new comprehensive guides created
-**Verified Infrastructure**: All systems confirmed operational
-**Improved Accessibility**: DokuWiki fully synchronized and functional
-**Established Procedures**: Maintenance workflows documented
-**Future-Proofed**: Roadmap and procedures for ongoing maintenance
The homelab documentation is now **comprehensive, current, and accessible** across all three systems, with proper maintenance procedures in place for ongoing updates.
---
**Completion Status**: ✅ **FULLY COMPLETED**
**Next Review**: February 21, 2026
**Maintainer**: Homelab Administrator
**Documentation Quality**: Excellent (95%+ coverage)

View File

@@ -0,0 +1,40 @@
# Deprecated Monitoring Stacks
These monitoring configurations are **DEPRECATED** and should not be used.
## Current Working Stack
The current working monitoring stack is located at:
- **`homelab_vm/monitoring.yaml`**
This stack is deployed via Portainer GitOps to the homelab-vm and includes:
- Prometheus with all scrape targets
- Grafana
- Node Exporter
- SNMP Exporter for Synology NAS devices
## Archived Configurations
The following directories contain old/deprecated monitoring configurations that were used before the consolidated stack:
### `prometheus_grafana_hub/`
Old monitoring hub setup with separate docker-compose files for each host.
- Used bind mounts which caused issues with Portainer git deploy
- Had separate compose files for each Synology NAS
- **Status: DEPRECATED** - Replaced by `homelab_vm/monitoring.yaml`
### `stacks-monitoring/`
Another old monitoring stack attempt.
- Used separate directories for prometheus and grafana configs
- **Status: DEPRECATED** - Replaced by `homelab_vm/monitoring.yaml`
### `prometheus/`
Standalone prometheus config directory.
- **Status: DEPRECATED** - Config now embedded in `homelab_vm/monitoring.yaml`
### `grafana/`
Standalone grafana provisioning configs.
- **Status: DEPRECATED** - Dashboards now managed directly in Grafana
## Migration Date
Archived on: $(date +%Y-%m-%d)

View File

@@ -0,0 +1,366 @@
{
"uid": "infrastructure-overview-v2",
"title": "Infrastructure Overview - All Devices",
"tags": [
"infrastructure",
"node-exporter",
"tailscale"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"templating": {
"list": [
{
"current": {},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"type": "datasource"
},
{
"allValue": "",
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info, job)",
"hide": 0,
"includeAll": true,
"label": "Host",
"multi": true,
"name": "job",
"query": "label_values(node_uname_info, job)",
"refresh": 1,
"regex": "",
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "stat",
"title": "Device Status",
"gridPos": {
"h": 5,
"w": 24,
"x": 0,
"y": 0
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"mappings": [
{
"type": "value",
"options": {
"0": {
"text": "DOWN",
"color": "red"
},
"1": {
"text": "UP",
"color": "green"
}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 1
}
]
}
}
},
"options": {
"colorMode": "background",
"textMode": "value_and_name",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "up{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 2,
"type": "timeseries",
"title": "CPU Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 5
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "100 - (avg by(job) (rate(node_cpu_seconds_total{mode=\"idle\", job=~\"$job\"}[5m])) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 3,
"type": "timeseries",
"title": "Memory Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 5
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "(1 - (node_memory_MemAvailable_bytes{job=~\"$job\"} / node_memory_MemTotal_bytes{job=~\"$job\"})) * 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 4,
"type": "bargauge",
"title": "Root Disk Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 13
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"displayMode": "gradient",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=~\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"} / node_filesystem_size_bytes{job=~\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"}) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 5,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 13
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_time_seconds{job=~\"$job\"} - node_boot_time_seconds{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 6,
"type": "timeseries",
"title": "Network Receive",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 21
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "sum by(job) (rate(node_network_receive_bytes_total{job=~\"$job\", device!~\"lo|docker.*|br-.*|veth.*\"}[5m]))",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 7,
"type": "timeseries",
"title": "Network Transmit",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 21
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "sum by(job) (rate(node_network_transmit_bytes_total{job=~\"$job\", device!~\"lo|docker.*|br-.*|veth.*\"}[5m]))",
"legendFormat": "{{job}}",
"refId": "A"
}
]
}
]
}

View File

@@ -0,0 +1,936 @@
{
"uid": "node-details-v2",
"title": "Node Details - Full Metrics",
"tags": [
"node-exporter",
"detailed",
"infrastructure"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"time": {
"from": "now-1h",
"to": "now"
},
"templating": {
"list": [
{
"current": {
"selected": false,
"text": "prometheus",
"value": "prometheus"
},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"type": "datasource"
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info, job)",
"hide": 0,
"includeAll": false,
"label": "Host",
"multi": false,
"name": "job",
"options": [],
"query": "label_values(node_uname_info, job)",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info{job=\"$job\"}, instance)",
"hide": 0,
"includeAll": false,
"label": "Instance",
"multi": false,
"name": "instance",
"options": [],
"query": "label_values(node_uname_info{job=\"$job\"}, instance)",
"refresh": 2,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "row",
"title": "\ud83d\udcca Quick Stats",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"collapsed": false
},
{
"id": 2,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 4,
"w": 4,
"x": 0,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_time_seconds{job=\"$job\",instance=\"$instance\"} - node_boot_time_seconds{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Uptime",
"refId": "A"
}
]
},
{
"id": 3,
"type": "stat",
"title": "CPU Cores",
"gridPos": {
"h": 4,
"w": 3,
"x": 4,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "blue",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "count(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"})",
"legendFormat": "Cores",
"refId": "A"
}
]
},
{
"id": 4,
"type": "stat",
"title": "Total RAM",
"gridPos": {
"h": 4,
"w": 3,
"x": 7,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "purple",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "RAM",
"refId": "A"
}
]
},
{
"id": 5,
"type": "gauge",
"title": "CPU",
"gridPos": {
"h": 4,
"w": 3,
"x": 10,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 60
},
{
"color": "red",
"value": 80
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - (avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"}[5m])) * 100)",
"legendFormat": "CPU",
"refId": "A"
}
]
},
{
"id": 6,
"type": "gauge",
"title": "Memory",
"gridPos": {
"h": 4,
"w": 3,
"x": 13,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "(1 - (node_memory_MemAvailable_bytes{job=\"$job\",instance=\"$instance\"} / node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"})) * 100",
"legendFormat": "Memory",
"refId": "A"
}
]
},
{
"id": 7,
"type": "gauge",
"title": "Disk /",
"gridPos": {
"h": 4,
"w": 3,
"x": 16,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=\"$job\",instance=\"$instance\",mountpoint=\"/\",fstype!=\"rootfs\"} / node_filesystem_size_bytes{job=\"$job\",instance=\"$instance\",mountpoint=\"/\",fstype!=\"rootfs\"}) * 100)",
"legendFormat": "Disk",
"refId": "A"
}
]
},
{
"id": 8,
"type": "stat",
"title": "Load 1m",
"gridPos": {
"h": 4,
"w": 2,
"x": 19,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"decimals": 2,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 2
},
{
"color": "red",
"value": 4
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "area",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_load1{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "1m",
"refId": "A"
}
]
},
{
"id": 9,
"type": "stat",
"title": "Load 5m",
"gridPos": {
"h": 4,
"w": 2,
"x": 21,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"decimals": 2,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 2
},
{
"color": "red",
"value": 4
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "area",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_load5{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "5m",
"refId": "A"
}
]
},
{
"id": 10,
"type": "row",
"title": "\ud83d\udda5\ufe0f CPU Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 5
},
"collapsed": false
},
{
"id": 11,
"type": "timeseries",
"title": "CPU Usage Breakdown",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 6
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"custom": {
"fillOpacity": 50,
"stacking": {
"mode": "normal",
"group": "A"
}
}
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"user\"}[5m])) * 100",
"legendFormat": "User",
"refId": "A"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"system\"}[5m])) * 100",
"legendFormat": "System",
"refId": "B"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"iowait\"}[5m])) * 100",
"legendFormat": "IOWait",
"refId": "C"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"steal\"}[5m])) * 100",
"legendFormat": "Steal",
"refId": "D"
}
]
},
{
"id": 12,
"type": "timeseries",
"title": "CPU Per Core",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 6
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "100 - (rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"}[5m]) * 100)",
"legendFormat": "CPU {{cpu}}",
"refId": "A"
}
]
},
{
"id": 20,
"type": "row",
"title": "\ud83e\udde0 Memory Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 14
},
"collapsed": false
},
{
"id": 21,
"type": "timeseries",
"title": "Memory Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 15
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"custom": {
"fillOpacity": 30,
"stacking": {
"mode": "normal",
"group": "A"
}
}
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"} - node_memory_MemAvailable_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Used",
"refId": "A"
},
{
"expr": "node_memory_Buffers_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Buffers",
"refId": "B"
},
{
"expr": "node_memory_Cached_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Cached",
"refId": "C"
},
{
"expr": "node_memory_MemFree_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Free",
"refId": "D"
}
]
},
{
"id": 22,
"type": "timeseries",
"title": "Swap Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 15
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes"
}
},
"targets": [
{
"expr": "node_memory_SwapTotal_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Total",
"refId": "A"
},
{
"expr": "node_memory_SwapTotal_bytes{job=\"$job\",instance=\"$instance\"} - node_memory_SwapFree_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Used",
"refId": "B"
}
]
},
{
"id": 30,
"type": "row",
"title": "\ud83d\udcbe Disk Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 23
},
"collapsed": false
},
{
"id": 31,
"type": "bargauge",
"title": "Disk Space Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 24
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"displayMode": "gradient",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=\"$job\",instance=\"$instance\",fstype!~\"tmpfs|overlay|squashfs\"} / node_filesystem_size_bytes{job=\"$job\",instance=\"$instance\",fstype!~\"tmpfs|overlay|squashfs\"}) * 100)",
"legendFormat": "{{mountpoint}}",
"refId": "A"
}
]
},
{
"id": 32,
"type": "timeseries",
"title": "Disk I/O",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 24
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
},
"overrides": [
{
"matcher": {
"id": "byRegexp",
"options": ".*Write.*"
},
"properties": [
{
"id": "custom.transform",
"value": "negative-Y"
}
]
}
]
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "rate(node_disk_read_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"loop.*|dm-.*\"}[5m])",
"legendFormat": "{{device}} Read",
"refId": "A"
},
{
"expr": "rate(node_disk_written_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"loop.*|dm-.*\"}[5m])",
"legendFormat": "{{device}} Write",
"refId": "B"
}
]
},
{
"id": 40,
"type": "row",
"title": "\ud83c\udf10 Network Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 32
},
"collapsed": false
},
{
"id": 41,
"type": "timeseries",
"title": "Network Traffic",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 33
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bps"
},
"overrides": [
{
"matcher": {
"id": "byRegexp",
"options": ".*TX.*"
},
"properties": [
{
"id": "custom.transform",
"value": "negative-Y"
}
]
}
]
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "rate(node_network_receive_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m]) * 8",
"legendFormat": "{{device}} RX",
"refId": "A"
},
{
"expr": "rate(node_network_transmit_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m]) * 8",
"legendFormat": "{{device}} TX",
"refId": "B"
}
]
},
{
"id": 42,
"type": "timeseries",
"title": "Network Errors",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 33
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "pps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "rate(node_network_receive_errs_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m])",
"legendFormat": "{{device}} RX Errors",
"refId": "A"
},
{
"expr": "rate(node_network_transmit_errs_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m])",
"legendFormat": "{{device}} TX Errors",
"refId": "B"
}
]
}
],
"id": null
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,351 @@
{
"uid": "synology-dashboard-v2",
"title": "Synology NAS Monitoring",
"tags": [
"synology",
"nas",
"snmp"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"templating": {
"list": [
{
"current": {},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"type": "datasource"
},
{
"allValue": "",
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(ssCpuRawIdle, job)",
"hide": 0,
"includeAll": true,
"label": "NAS",
"multi": true,
"name": "job",
"query": "label_values(ssCpuRawIdle, job)",
"refresh": 1,
"regex": "",
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "stat",
"title": "NAS Status",
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 0
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"mappings": [
{
"type": "value",
"options": {
"0": {
"text": "DOWN",
"color": "red"
},
"1": {
"text": "UP",
"color": "green"
}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 1
}
]
}
}
},
"options": {
"colorMode": "background",
"textMode": "value_and_name",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "up{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 2,
"type": "gauge",
"title": "CPU Usage",
"gridPos": {
"h": 6,
"w": 8,
"x": 0,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 60
},
{
"color": "red",
"value": 80
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((ssCpuRawIdle{job=~\"$job\"} / (ssCpuRawUser{job=~\"$job\"} + ssCpuRawSystem{job=~\"$job\"} + ssCpuRawIdle{job=~\"$job\"} + ssCpuRawWait{job=~\"$job\"})) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 3,
"type": "gauge",
"title": "Memory Usage",
"gridPos": {
"h": 6,
"w": 8,
"x": 8,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 90
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "((memTotalReal{job=~\"$job\"} - memAvailReal{job=~\"$job\"}) / memTotalReal{job=~\"$job\"}) * 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 4,
"type": "stat",
"title": "Total Memory",
"gridPos": {
"h": 6,
"w": 8,
"x": 16,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "decbytes",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "blue",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "memTotalReal{job=~\"$job\"} * 1024",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 5,
"type": "timeseries",
"title": "Load Average",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 10
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "laLoad{job=~\"$job\", laIndex=\"1\"}",
"legendFormat": "{{job}} 1m",
"refId": "A"
},
{
"expr": "laLoad{job=~\"$job\", laIndex=\"2\"}",
"legendFormat": "{{job}} 5m",
"refId": "B"
},
{
"expr": "laLoad{job=~\"$job\", laIndex=\"3\"}",
"legendFormat": "{{job}} 15m",
"refId": "C"
}
]
},
{
"id": 6,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 10
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "sysUpTime{job=~\"$job\"} / 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
}
]
}

View File

@@ -0,0 +1,13 @@
apiVersion: 1
providers:
- name: 'Homelab Dashboards'
orgId: 1
folder: ''
folderUid: ''
type: file
disableDeletion: false
updateIntervalSeconds: 30
allowUiUpdates: true
options:
path: /etc/grafana/dashboards

View File

@@ -0,0 +1,9 @@
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: false

View File

@@ -0,0 +1,98 @@
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "homelab-node"
static_configs:
- targets: ["100.67.40.126:9100"]
- job_name: "raspberry-pis"
static_configs:
- targets: ["100.77.151.40:9100"] # pi-5
- targets: ["100.123.246.75:9100"] # pi-5-kevin
- job_name: "setillo-node"
static_configs:
- targets: ["100.125.0.20:9100"]
- job_name: "setillo-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.125.0.20:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.125.0.20"
- target_label: __address__
replacement: "100.125.0.20:9116"
- job_name: "calypso-node"
static_configs:
- targets: ["100.103.48.78:9100"]
- job_name: "calypso-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.103.48.78:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.103.48.78"
- target_label: __address__
replacement: "100.103.48.78:9116"
- job_name: "atlantis-node"
static_configs:
- targets: ["100.83.230.112:9100"]
- job_name: "atlantis-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.83.230.112:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.83.230.112"
- target_label: __address__
replacement: "100.83.230.112:9116"
- job_name: "concord-nuc-node"
static_configs:
- targets: ["100.72.55.21:9100"]
- job_name: "truenas-node"
static_configs:
- targets: ["100.75.252.64:9100"]
- job_name: "vmi2076105-node"
static_configs:
- targets: ["100.99.156.20:9100"]
- job_name: "proxmox-node"
static_configs:
- targets: ["100.87.12.28:9100"]

View File

@@ -0,0 +1,11 @@
FROM golang:1.23 AS build
WORKDIR /app
RUN git clone https://github.com/kradalby/truenas_exporter.git .
RUN go build -o truenas_exporter .
FROM debian:stable-slim
WORKDIR /root/
COPY --from=build /app/truenas_exporter .
EXPOSE 9163
ENTRYPOINT ["./truenas_exporter"]

View File

@@ -0,0 +1,83 @@
# Prometheus & Grafana Monitoring Hub
This folder contains the configuration for the centralized monitoring stack running on the Homelab VM.
## Folder Structure
```
prometheus_grafana_hub/
├── dashboards/ # Grafana dashboard JSON files
│ ├── infrastructure-overview.json # Fleet-wide status of all devices
│ ├── node-details.json # Detailed per-host metrics
│ ├── synology-monitoring.json # Synology NAS SNMP metrics
│ └── node-exporter.json # Full Node Exporter dashboard
├── snmp-configs/ # SNMP Exporter configurations
│ └── snmp_synology.yml # Synology NAS SNMP config
├── docker-compose/ # Docker compose files for remote hosts
│ ├── atlantis-docker-compose.yml
│ ├── calypso-docker-compose.yml
│ ├── setillo-docker-compose.yml
│ ├── concord-nuc-docker-compose.yml
│ └── guava-docker-compose-node-exporter.yml
├── docker-compose.homelab-vm.yml # Main stack compose (Homelab VM)
├── prometheus.yml # Prometheus scrape configuration
├── Dockerfile # Custom Prometheus image (if needed)
└── README.md
```
## Dashboards
| Dashboard | UID | Description |
|-----------|-----|-------------|
| Infrastructure Overview | `infrastructure-overview-v2` | Fleet status, CPU, Memory, Disk, Network for all hosts |
| Node Details | `node-details-v2` | Per-REDACTED_APP_PASSWORD CPU breakdown, per-core usage, memory details, disk I/O |
| Synology Monitoring | `synology-dashboard-v2` | Synology NAS CPU, Memory, Load, Uptime via SNMP |
| Node Exporter Full | `rYdddlPWk` | Comprehensive node exporter metrics |
## SNMP Configuration
The `snmp_synology.yml` config is deployed to each Synology NAS at:
- **Atlantis**: `/volume2/metadata/docker/snmp/snmp.yml`
- **Calypso**: `/volume1/docker/snmp/snmp.yml`
- **Setillo**: `/volume1/docker/snmp/snmp.yml`
## Monitored Hosts
### Node Exporter Targets
- homelab-node (100.67.40.126:9100)
- atlantis-node (100.83.230.112:9100)
- calypso-node (100.103.48.78:9100)
- setillo-node (100.125.0.20:9100)
- concord-nuc-node (100.72.55.21:9100)
- proxmox-node (100.87.12.28:9100)
- truenas-node (100.75.252.64:9100)
- raspberry-pis (100.77.151.40:9100)
### SNMP Targets (Synology)
- atlantis-snmp (100.83.230.112)
- calypso-snmp (100.103.48.78)
- setillo-snmp (100.125.0.20)
## Deployment
### Homelab VM (Main Stack)
The main monitoring stack runs on Homelab VM:
```bash
cd ~/docker/monitoring
# Using the compose file from this repo:
docker-compose -f docker-compose.homelab-vm.yml up -d
# Or if already deployed:
docker-compose up -d
```
**Services:**
- **Grafana**: http://homelab:3300 (admin / set via GF_SECURITY_ADMIN_PASSWORD)
- **Prometheus**: http://homelab:9090
- **Node Exporter**: Runs in host network mode on port 9100
### Remote Hosts
Each remote host runs node-exporter and/or snmp-exporter as specified in the `docker-compose/` folder.

View File

@@ -0,0 +1,135 @@
# Homelab Alerting Stack
This adds Prometheus Alertmanager with notifications to both **ntfy** and **Signal**.
## Components
| Component | Purpose | Port |
|-----------|---------|------|
| Alertmanager | Routes alerts based on severity | 9093 |
| Signal Bridge | Forwards critical alerts to Signal | 5000 |
## Alert Routing
- **Warning alerts** → ntfy only (`homelab-alerts` topic)
- **Critical alerts** → Both ntfy AND Signal
## Deployment Steps
### 1. Update your phone number
Edit `docker-compose.alerting.yml` and replace `REPLACE_WITH_YOUR_NUMBER`:
```yaml
environment:
- SIGNAL_SENDER=+REDACTED_PHONE_NUMBER # Your Signal number
- SIGNAL_RECIPIENTS=+REDACTED_PHONE_NUMBER # Where to send alerts
```
### 2. Copy files to Homelab VM
```bash
# On your local machine or wherever you have SSH access
scp -r alerting-configs/* homelab@192.168.0.210:~/docker/monitoring/
```
### 3. Update Prometheus config
Replace the existing `prometheus.yml` with `prometheus-updated.yml`:
```bash
cd ~/docker/monitoring
cp prometheus-updated.yml prometheus/prometheus.yml
cp alert-rules.yml prometheus/alert-rules.yml
```
### 4. Create alertmanager directory
```bash
mkdir -p alertmanager
cp alertmanager.yml alertmanager/
```
### 5. Deploy the alerting stack
```bash
# Build and start alertmanager + signal bridge
docker-compose -f docker-compose.alerting.yml up -d --build
# Reload Prometheus to pick up new config
curl -X POST http://localhost:9090/-/reload
```
### 6. Verify deployment
```bash
# Check Alertmanager is running
curl http://localhost:9093/-/healthy
# Check Signal Bridge is running
curl http://localhost:5000/health
# Send test alert to Signal
curl -X POST http://localhost:5000/test \
-H "Content-Type: application/json" \
-d '{"message": "🧪 Test alert from Homelab!"}'
# Send test notification to ntfy
curl -d "Test alert from Alertmanager setup" https://ntfy.vish.gg/REDACTED_NTFY_TOPIC
```
## Alert Rules Included
| Alert | Severity | Trigger |
|-------|----------|---------|
| HostDown | Critical | Host unreachable for 2 min |
| REDACTED_APP_PASSWORD | Warning | CPU > 80% for 5 min |
| HostCriticalCpuUsage | Critical | CPU > 95% for 5 min |
| HostHighMemoryUsage | Warning | Memory > 85% for 5 min |
| HostCriticalMemoryUsage | Critical | Memory > 95% for 5 min |
| HostOutOfMemory | Critical | Memory < 5% available |
| HostHighDiskUsage | Warning | Disk > 80% full |
| HostCriticalDiskUsage | Critical | Disk > 90% full |
| HostDiskWillFillIn24Hours | Warning | Predicted to fill in 24h |
| REDACTED_APP_PASSWORD | Critical | Filesystem became read-only |
| HostNetworkErrors | Warning | Network errors detected |
| HostClockSkew | Warning | Time drift > 0.5 seconds |
## Receiving Alerts
### ntfy App
1. Install ntfy app on your phone (iOS/Android)
2. Add server: `https://ntfy.vish.gg`
3. Subscribe to topic: `homelab-alerts`
### Signal
- Alerts will arrive as regular Signal messages from your registered number
## Troubleshooting
### Check Alertmanager status
```bash
docker logs alertmanager
curl http://localhost:9093/api/v2/status
```
### Check active alerts
```bash
curl http://localhost:9093/api/v2/alerts
```
### Check Signal Bridge logs
```bash
docker logs signal-bridge
```
### Manually trigger test alert in Prometheus
Add this rule temporarily to test:
```yaml
- alert: TestAlert
expr: vector(1)
labels:
severity: warning
annotations:
summary: "Test alert"
```

View File

@@ -0,0 +1,146 @@
# Prometheus Alerting Rules for Homelab Infrastructure
groups:
- name: host-availability
interval: 30s
rules:
- alert: HostDown
expr: up{job=~".*-node"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Host {{ $labels.instance }} is down"
description: "Host {{ $labels.instance }} has been unreachable for more than 2 minutes."
- alert: HostHighLoadAverage
expr: node_load15 / count without(cpu, mode) (node_cpu_seconds_total{mode="idle"}) > 2
for: 10m
labels:
severity: warning
annotations:
summary: "High load average on {{ $labels.instance }}"
description: "15-minute load average is {{ $value | printf \"%.2f\" }} on {{ $labels.instance }}."
- name: cpu-alerts
interval: 30s
rules:
- alert: REDACTED_APP_PASSWORD
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is {{ $value | printf \"%.1f\" }}% on {{ $labels.instance }}."
- alert: HostCriticalCpuUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 95
for: 5m
labels:
severity: critical
annotations:
summary: "🔥 CRITICAL CPU on {{ $labels.instance }}"
description: "CPU usage is {{ $value | printf \"%.1f\" }}% on {{ $labels.instance }}. Immediate attention required!"
- name: memory-alerts
interval: 30s
rules:
- alert: HostHighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "Memory usage is {{ $value | printf \"%.1f\" }}% on {{ $labels.instance }}."
- alert: HostCriticalMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 95
for: 5m
labels:
severity: critical
annotations:
summary: "🔥 CRITICAL Memory on {{ $labels.instance }}"
description: "Memory usage is {{ $value | printf \"%.1f\" }}% on {{ $labels.instance }}."
- alert: HostOutOfMemory
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 5
for: 2m
labels:
severity: critical
annotations:
summary: "💀 OUT OF MEMORY on {{ $labels.instance }}"
description: "Only {{ $value | printf \"%.1f\" }}% memory available on {{ $labels.instance }}."
- name: disk-alerts
interval: 60s
rules:
- alert: HostHighDiskUsage
expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Disk space warning on {{ $labels.instance }}"
description: "Disk {{ $labels.mountpoint }} is {{ $value | printf \"%.1f\" }}% full on {{ $labels.instance }}."
- alert: HostCriticalDiskUsage
expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "🔥 CRITICAL Disk space on {{ $labels.instance }}"
description: "Disk {{ $labels.mountpoint }} is {{ $value | printf \"%.1f\" }}% full on {{ $labels.instance }}."
- alert: HostDiskWillFillIn24Hours
expr: predict_linear(node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"}[6h], 24*60*60) < 0
for: 30m
labels:
severity: warning
annotations:
summary: "Disk {{ $labels.mountpoint }} will fill within 24 hours"
description: "Based on current growth rate, disk on {{ $labels.instance }} will be full within 24 hours."
- alert: REDACTED_APP_PASSWORD
expr: node_filesystem_readonly{fstype!~"tmpfs|overlay"} == 1
for: 1m
labels:
severity: critical
annotations:
summary: "🔥 Filesystem is read-only on {{ $labels.instance }}"
description: "Filesystem {{ $labels.mountpoint }} has become read-only. This usually indicates disk failure!"
- name: network-alerts
interval: 30s
rules:
- alert: HostNetworkReceiveErrors
expr: rate(node_network_receive_errs_total{device!~"lo|veth.*|docker.*|br-.*"}[5m]) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "Network receive errors on {{ $labels.instance }}"
description: "{{ $labels.device }} has {{ $value | printf \"%.0f\" }} receive errors/sec."
- alert: HostNetworkTransmitErrors
expr: rate(node_network_transmit_errs_total{device!~"lo|veth.*|docker.*|br-.*"}[5m]) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "Network transmit errors on {{ $labels.instance }}"
description: "{{ $labels.device }} has {{ $value | printf \"%.0f\" }} transmit errors/sec."
- name: system-alerts
interval: 60s
rules:
- alert: HostClockSkew
expr: abs(node_timex_offset_seconds) > 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "Clock skew detected on {{ $labels.instance }}"
description: "Clock is off by {{ $value | printf \"%.2f\" }} seconds."

View File

@@ -0,0 +1,58 @@
# Alertmanager Configuration for Homelab
# Routes alerts to both ntfy and Signal
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'ntfy-all'
routes:
# Critical alerts go to both Signal AND ntfy
- match:
severity: critical
receiver: 'critical-alerts'
continue: false
# Warning alerts go to ntfy only
- match:
severity: warning
receiver: 'ntfy-all'
receivers:
# ntfy receiver for all alerts
- name: 'ntfy-all'
webhook_configs:
- url: 'http://NTFY:80/homelab-alerts'
send_resolved: true
http_config:
follow_redirects: true
max_alerts: 10
# Critical alerts: Signal + ntfy
- name: 'critical-alerts'
webhook_configs:
# ntfy for critical
- url: 'http://NTFY:80/homelab-alerts'
send_resolved: true
http_config:
follow_redirects: true
max_alerts: 5
# Signal via bridge service
- url: 'http://signal-bridge:5000/alert'
send_resolved: true
http_config:
follow_redirects: true
max_alerts: 3
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']

View File

@@ -0,0 +1,49 @@
# Alertmanager Configuration for Homelab
# Routes alerts to both ntfy (via bridge) and Signal
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'ntfy-all'
routes:
# Critical alerts go to both Signal AND ntfy
- match:
severity: critical
receiver: 'critical-alerts'
continue: false
# Warning alerts go to ntfy only
- match:
severity: warning
receiver: 'ntfy-all'
receivers:
# ntfy receiver for all alerts (via bridge for nice formatting)
- name: 'ntfy-all'
webhook_configs:
- url: 'http://ntfy-bridge:5001/alert'
send_resolved: true
# Critical alerts: Signal + ntfy
- name: 'critical-alerts'
webhook_configs:
# ntfy via bridge (formatted nicely)
- url: 'http://ntfy-bridge:5001/alert'
send_resolved: true
# Signal via bridge service
- url: 'http://signal-bridge:5000/alert'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']

View File

@@ -0,0 +1,68 @@
# Alerting Stack for Homelab
services:
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
restart: unless-stopped
ports:
- "9093:9093"
volumes:
- ./alertmanager:/etc/alertmanager
- alertmanager-data:/alertmanager
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
- '--web.external-url=http://localhost:9093'
networks:
- monitoring-stack_default
- signal-api-stack_default
- ntfy-stack_default
signal-bridge:
build: ./signal-bridge
container_name: signal-bridge
restart: unless-stopped
ports:
- "5000:5000"
environment:
- SIGNAL_API_URL=http://signal-api:8080
- SIGNAL_SENDER=+REDACTED_PHONE_NUMBER
- SIGNAL_RECIPIENTS=+REDACTED_PHONE_NUMBER
networks:
- monitoring-stack_default
- signal-api-stack_default
healthcheck:
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5000/health')"]
interval: 30s
timeout: 10s
retries: 3
ntfy-bridge:
build: ./ntfy-bridge
container_name: ntfy-bridge
restart: unless-stopped
ports:
- "5001:5001"
environment:
- NTFY_URL=http://NTFY:80
- NTFY_TOPIC="REDACTED_NTFY_TOPIC"
networks:
- monitoring-stack_default
- ntfy-stack_default
healthcheck:
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5001/health')"]
interval: 30s
timeout: 10s
retries: 3
volumes:
alertmanager-data:
networks:
monitoring-stack_default:
external: true
signal-api-stack_default:
external: true
ntfy-stack_default:
external: true

View File

@@ -0,0 +1,5 @@
FROM python:3.11-slim
WORKDIR /app
RUN pip install --no-cache-dir flask requests gunicorn
COPY app.py .
CMD ["gunicorn", "--bind", "0.0.0.0:5001", "--workers", "2", "app:app"]

View File

@@ -0,0 +1,104 @@
from flask import Flask, request, jsonify
import requests
import os
app = Flask(__name__)
NTFY_URL = os.environ.get('NTFY_URL', 'http://NTFY:80')
NTFY_TOPIC = os.environ.get('NTFY_TOPIC', 'homelab-alerts')
def get_status_icon(severity, status):
if status == 'resolved':
return 'white_check_mark'
if severity == 'critical':
return 'rotating_light'
return 'warning'
def get_priority(severity, status):
if status == 'resolved':
return '3'
if severity == 'critical':
return '5'
return '4'
def format_alert(alert):
status = alert.get('status', 'firing')
labels = alert.get('labels', {})
annotations = alert.get('annotations', {})
alertname = labels.get('alertname', 'Unknown Alert')
severity = labels.get('severity', 'warning')
instance = labels.get('instance', 'unknown')
status_text = 'RESOLVED' if status == 'resolved' else 'FIRING'
title = f"{alertname} [{status_text}]"
summary = annotations.get('summary', '')
description = annotations.get('description', '')
body_parts = []
if summary:
body_parts.append(summary)
if description and description != summary:
body_parts.append(description)
if instance and instance != 'unknown':
body_parts.append(f"Host: {instance}")
body = '\n'.join(body_parts) if body_parts else f"Alert {status_text.lower()} on {instance}"
return title, body, severity, status
@app.route('/alert', methods=['POST'])
def handle_alert():
try:
data = request.json
alerts = data.get('alerts', [])
for alert in alerts:
title, body, severity, status = format_alert(alert)
priority = get_priority(severity, status)
tag = get_status_icon(severity, status)
response = requests.post(
f"{NTFY_URL}/{NTFY_TOPIC}",
data=body,
headers={
'Title': title,
'Priority': priority,
'Tags': tag
}
)
if response.status_code not in [200, 201]:
print(f"Failed to send to ntfy: {response.status_code} - {response.text}")
return jsonify({'status': 'sent', 'count': len(alerts)})
except Exception as e:
print(f"Error: {e}")
return jsonify({'status': 'error', 'message': str(e)}), 500
@app.route('/health', methods=['GET'])
def health():
return jsonify({'status': 'healthy'})
@app.route('/test', methods=['POST'])
def test():
try:
data = request.json or {}
message = data.get('message', 'Test notification from ntfy-bridge')
response = requests.post(
f"{NTFY_URL}/{NTFY_TOPIC}",
data=message,
headers={
'Title': 'Test Alert',
'Priority': '4',
'Tags': 'test_tube'
}
)
return jsonify({'status': 'sent'})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001)

View File

@@ -0,0 +1,117 @@
# Updated Prometheus Configuration with Alertmanager
# This adds alerting configuration to your existing prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s # How often to evaluate rules
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
# Load alerting rules
rule_files:
- /etc/prometheus/alert-rules.yml
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "alertmanager"
static_configs:
- targets: ["alertmanager:9093"]
- job_name: "homelab-node"
static_configs:
- targets: ["100.67.40.126:9100"]
- job_name: "raspberry-pis"
static_configs:
- targets: ["100.77.151.40:9100"] # pi-5
- targets: ["100.123.246.75:9100"] # pi-5-kevin
- job_name: "setillo-node"
static_configs:
- targets: ["100.125.0.20:9100"]
- job_name: "setillo-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.125.0.20:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.125.0.20"
- target_label: __address__
replacement: "100.125.0.20:9116"
- job_name: "calypso-node"
static_configs:
- targets: ["100.103.48.78:9100"]
- job_name: "calypso-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.103.48.78:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.103.48.78"
- target_label: __address__
replacement: "100.103.48.78:9116"
- job_name: "atlantis-node"
static_configs:
- targets: ["100.83.230.112:9100"]
- job_name: "atlantis-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.83.230.112:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.83.230.112"
- target_label: __address__
replacement: "100.83.230.112:9116"
- job_name: "concord-nuc-node"
static_configs:
- targets: ["100.72.55.21:9100"]
- job_name: "truenas-node"
static_configs:
- targets: ["100.75.252.64:9100"]
- job_name: "vmi2076105-node"
static_configs:
- targets: ["100.99.156.20:9100"]
- job_name: "proxmox-node"
static_configs:
- targets: ["100.87.12.28:9100"]

View File

@@ -0,0 +1,11 @@
FROM python:3.11-slim
WORKDIR /app
RUN pip install --no-cache-dir flask requests gunicorn
COPY app.py .
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "2", "--timeout", "60", "app:app"]

View File

@@ -0,0 +1,130 @@
#!/usr/bin/env python3
"""
Signal Bridge for Alertmanager
Receives webhooks from Alertmanager and forwards to Signal API
"""
import os
import json
import requests
from flask import Flask, request, jsonify
app = Flask(__name__)
# Configuration from environment variables
SIGNAL_API_URL = os.environ.get('SIGNAL_API_URL', 'http://signal-api:8080')
SIGNAL_SENDER = os.environ.get('SIGNAL_SENDER', '') # Your Signal number
SIGNAL_RECIPIENTS = os.environ.get('SIGNAL_RECIPIENTS', '').split(',') # Comma-separated
def format_alert_message(alert_data):
"""Format Alertmanager webhook payload into a readable message"""
messages = []
status = alert_data.get('status', 'unknown')
for alert in alert_data.get('alerts', []):
alert_status = alert.get('status', status)
labels = alert.get('labels', {})
annotations = alert.get('annotations', {})
severity = labels.get('severity', 'unknown')
alertname = labels.get('alertname', 'Unknown Alert')
instance = labels.get('instance', 'unknown')
summary = annotations.get('summary', alertname)
description = annotations.get('description', '')
# Status emoji
if alert_status == 'resolved':
status_emoji = ''
status_text = 'RESOLVED'
elif severity == 'critical':
status_emoji = '🚨'
status_text = 'CRITICAL'
else:
status_emoji = '⚠️'
status_text = 'WARNING'
msg = f"{status_emoji} [{status_text}] {summary}"
if description:
msg += f"\n{description}"
messages.append(msg)
return "\n\n".join(messages)
def send_signal_message(message):
"""Send message via Signal API"""
if not SIGNAL_SENDER or not SIGNAL_RECIPIENTS:
app.logger.error("Signal sender or recipients not configured")
return False
success = True
for recipient in SIGNAL_RECIPIENTS:
recipient = recipient.strip()
if not recipient:
continue
try:
payload = {
"message": message,
"number": SIGNAL_SENDER,
"recipients": [recipient]
}
response = requests.post(
f"{SIGNAL_API_URL}/v2/send",
json=payload,
timeout=30
)
if response.status_code in [200, 201]:
app.logger.info(f"Message sent to {recipient}")
else:
app.logger.error(f"Failed to send to {recipient}: {response.status_code} - {response.text}")
success = False
except Exception as e:
app.logger.error(f"Error sending to {recipient}: {e}")
success = False
return success
@app.route('/health', methods=['GET'])
def health():
return jsonify({"status": "healthy"}), 200
@app.route('/alert', methods=['POST'])
def receive_alert():
"""Receive alert from Alertmanager and forward to Signal"""
try:
alert_data = request.get_json()
if not alert_data:
return jsonify({"error": "No data received"}), 400
app.logger.info(f"Received alert: {json.dumps(alert_data, indent=2)}")
message = format_alert_message(alert_data)
if send_signal_message(message):
return jsonify({"status": "sent"}), 200
else:
return jsonify({"status": "partial_failure"}), 207
except Exception as e:
app.logger.error(f"Error processing alert: {e}")
return jsonify({"error": str(e)}), 500
@app.route('/test', methods=['POST'])
def test_message():
"""Send a test message"""
message = request.json.get('message', '🧪 Test alert from Signal Bridge')
if send_signal_message(message):
return jsonify({"status": "sent"}), 200
else:
return jsonify({"status": "failed"}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

View File

@@ -0,0 +1,366 @@
{
"uid": "infrastructure-overview-v2",
"title": "Infrastructure Overview - All Devices",
"tags": [
"infrastructure",
"node-exporter",
"tailscale"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"templating": {
"list": [
{
"current": {},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"type": "datasource"
},
{
"allValue": "",
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info, job)",
"hide": 0,
"includeAll": true,
"label": "Host",
"multi": true,
"name": "job",
"query": "label_values(node_uname_info, job)",
"refresh": 1,
"regex": "",
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "stat",
"title": "Device Status",
"gridPos": {
"h": 5,
"w": 24,
"x": 0,
"y": 0
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"mappings": [
{
"type": "value",
"options": {
"0": {
"text": "DOWN",
"color": "red"
},
"1": {
"text": "UP",
"color": "green"
}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 1
}
]
}
}
},
"options": {
"colorMode": "background",
"textMode": "value_and_name",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "up{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 2,
"type": "timeseries",
"title": "CPU Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 5
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "100 - (avg by(job) (rate(node_cpu_seconds_total{mode=\"idle\", job=~\"$job\"}[5m])) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 3,
"type": "timeseries",
"title": "Memory Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 5
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "(1 - (node_memory_MemAvailable_bytes{job=~\"$job\"} / node_memory_MemTotal_bytes{job=~\"$job\"})) * 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 4,
"type": "bargauge",
"title": "Root Disk Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 13
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"displayMode": "gradient",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=~\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"} / node_filesystem_size_bytes{job=~\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"}) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 5,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 13
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_time_seconds{job=~\"$job\"} - node_boot_time_seconds{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 6,
"type": "timeseries",
"title": "Network Receive",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 21
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "sum by(job) (rate(node_network_receive_bytes_total{job=~\"$job\", device!~\"lo|docker.*|br-.*|veth.*\"}[5m]))",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 7,
"type": "timeseries",
"title": "Network Transmit",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 21
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "sum by(job) (rate(node_network_transmit_bytes_total{job=~\"$job\", device!~\"lo|docker.*|br-.*|veth.*\"}[5m]))",
"legendFormat": "{{job}}",
"refId": "A"
}
]
}
]
}

View File

@@ -0,0 +1,936 @@
{
"uid": "node-details-v2",
"title": "Node Details - Full Metrics",
"tags": [
"node-exporter",
"detailed",
"infrastructure"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"time": {
"from": "now-1h",
"to": "now"
},
"templating": {
"list": [
{
"current": {
"selected": false,
"text": "prometheus",
"value": "prometheus"
},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"type": "datasource"
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info, job)",
"hide": 0,
"includeAll": false,
"label": "Host",
"multi": false,
"name": "job",
"options": [],
"query": "label_values(node_uname_info, job)",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info{job=\"$job\"}, instance)",
"hide": 0,
"includeAll": false,
"label": "Instance",
"multi": false,
"name": "instance",
"options": [],
"query": "label_values(node_uname_info{job=\"$job\"}, instance)",
"refresh": 2,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "row",
"title": "\ud83d\udcca Quick Stats",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"collapsed": false
},
{
"id": 2,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 4,
"w": 4,
"x": 0,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_time_seconds{job=\"$job\",instance=\"$instance\"} - node_boot_time_seconds{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Uptime",
"refId": "A"
}
]
},
{
"id": 3,
"type": "stat",
"title": "CPU Cores",
"gridPos": {
"h": 4,
"w": 3,
"x": 4,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "blue",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "count(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"})",
"legendFormat": "Cores",
"refId": "A"
}
]
},
{
"id": 4,
"type": "stat",
"title": "Total RAM",
"gridPos": {
"h": 4,
"w": 3,
"x": 7,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "purple",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "RAM",
"refId": "A"
}
]
},
{
"id": 5,
"type": "gauge",
"title": "CPU",
"gridPos": {
"h": 4,
"w": 3,
"x": 10,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 60
},
{
"color": "red",
"value": 80
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - (avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"}[5m])) * 100)",
"legendFormat": "CPU",
"refId": "A"
}
]
},
{
"id": 6,
"type": "gauge",
"title": "Memory",
"gridPos": {
"h": 4,
"w": 3,
"x": 13,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "(1 - (node_memory_MemAvailable_bytes{job=\"$job\",instance=\"$instance\"} / node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"})) * 100",
"legendFormat": "Memory",
"refId": "A"
}
]
},
{
"id": 7,
"type": "gauge",
"title": "Disk /",
"gridPos": {
"h": 4,
"w": 3,
"x": 16,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=\"$job\",instance=\"$instance\",mountpoint=\"/\",fstype!=\"rootfs\"} / node_filesystem_size_bytes{job=\"$job\",instance=\"$instance\",mountpoint=\"/\",fstype!=\"rootfs\"}) * 100)",
"legendFormat": "Disk",
"refId": "A"
}
]
},
{
"id": 8,
"type": "stat",
"title": "Load 1m",
"gridPos": {
"h": 4,
"w": 2,
"x": 19,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"decimals": 2,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 2
},
{
"color": "red",
"value": 4
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "area",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_load1{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "1m",
"refId": "A"
}
]
},
{
"id": 9,
"type": "stat",
"title": "Load 5m",
"gridPos": {
"h": 4,
"w": 2,
"x": 21,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"decimals": 2,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 2
},
{
"color": "red",
"value": 4
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "area",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_load5{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "5m",
"refId": "A"
}
]
},
{
"id": 10,
"type": "row",
"title": "\ud83d\udda5\ufe0f CPU Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 5
},
"collapsed": false
},
{
"id": 11,
"type": "timeseries",
"title": "CPU Usage Breakdown",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 6
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"custom": {
"fillOpacity": 50,
"stacking": {
"mode": "normal",
"group": "A"
}
}
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"user\"}[5m])) * 100",
"legendFormat": "User",
"refId": "A"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"system\"}[5m])) * 100",
"legendFormat": "System",
"refId": "B"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"iowait\"}[5m])) * 100",
"legendFormat": "IOWait",
"refId": "C"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"steal\"}[5m])) * 100",
"legendFormat": "Steal",
"refId": "D"
}
]
},
{
"id": 12,
"type": "timeseries",
"title": "CPU Per Core",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 6
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "100 - (rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"}[5m]) * 100)",
"legendFormat": "CPU {{cpu}}",
"refId": "A"
}
]
},
{
"id": 20,
"type": "row",
"title": "\ud83e\udde0 Memory Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 14
},
"collapsed": false
},
{
"id": 21,
"type": "timeseries",
"title": "Memory Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 15
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"custom": {
"fillOpacity": 30,
"stacking": {
"mode": "normal",
"group": "A"
}
}
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"} - node_memory_MemAvailable_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Used",
"refId": "A"
},
{
"expr": "node_memory_Buffers_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Buffers",
"refId": "B"
},
{
"expr": "node_memory_Cached_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Cached",
"refId": "C"
},
{
"expr": "node_memory_MemFree_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Free",
"refId": "D"
}
]
},
{
"id": 22,
"type": "timeseries",
"title": "Swap Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 15
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes"
}
},
"targets": [
{
"expr": "node_memory_SwapTotal_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Total",
"refId": "A"
},
{
"expr": "node_memory_SwapTotal_bytes{job=\"$job\",instance=\"$instance\"} - node_memory_SwapFree_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Used",
"refId": "B"
}
]
},
{
"id": 30,
"type": "row",
"title": "\ud83d\udcbe Disk Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 23
},
"collapsed": false
},
{
"id": 31,
"type": "bargauge",
"title": "Disk Space Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 24
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"displayMode": "gradient",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=\"$job\",instance=\"$instance\",fstype!~\"tmpfs|overlay|squashfs\"} / node_filesystem_size_bytes{job=\"$job\",instance=\"$instance\",fstype!~\"tmpfs|overlay|squashfs\"}) * 100)",
"legendFormat": "{{mountpoint}}",
"refId": "A"
}
]
},
{
"id": 32,
"type": "timeseries",
"title": "Disk I/O",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 24
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
},
"overrides": [
{
"matcher": {
"id": "byRegexp",
"options": ".*Write.*"
},
"properties": [
{
"id": "custom.transform",
"value": "negative-Y"
}
]
}
]
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "rate(node_disk_read_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"loop.*|dm-.*\"}[5m])",
"legendFormat": "{{device}} Read",
"refId": "A"
},
{
"expr": "rate(node_disk_written_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"loop.*|dm-.*\"}[5m])",
"legendFormat": "{{device}} Write",
"refId": "B"
}
]
},
{
"id": 40,
"type": "row",
"title": "\ud83c\udf10 Network Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 32
},
"collapsed": false
},
{
"id": 41,
"type": "timeseries",
"title": "Network Traffic",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 33
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bps"
},
"overrides": [
{
"matcher": {
"id": "byRegexp",
"options": ".*TX.*"
},
"properties": [
{
"id": "custom.transform",
"value": "negative-Y"
}
]
}
]
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "rate(node_network_receive_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m]) * 8",
"legendFormat": "{{device}} RX",
"refId": "A"
},
{
"expr": "rate(node_network_transmit_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m]) * 8",
"legendFormat": "{{device}} TX",
"refId": "B"
}
]
},
{
"id": 42,
"type": "timeseries",
"title": "Network Errors",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 33
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "pps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "rate(node_network_receive_errs_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m])",
"legendFormat": "{{device}} RX Errors",
"refId": "A"
},
{
"expr": "rate(node_network_transmit_errs_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m])",
"legendFormat": "{{device}} TX Errors",
"refId": "B"
}
]
}
],
"id": null
}

View File

@@ -0,0 +1,351 @@
{
"uid": "synology-dashboard-v2",
"title": "Synology NAS Monitoring",
"tags": [
"synology",
"nas",
"snmp"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"templating": {
"list": [
{
"current": {},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"type": "datasource"
},
{
"allValue": "",
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(ssCpuRawIdle, job)",
"hide": 0,
"includeAll": true,
"label": "NAS",
"multi": true,
"name": "job",
"query": "label_values(ssCpuRawIdle, job)",
"refresh": 1,
"regex": "",
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "stat",
"title": "NAS Status",
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 0
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"mappings": [
{
"type": "value",
"options": {
"0": {
"text": "DOWN",
"color": "red"
},
"1": {
"text": "UP",
"color": "green"
}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 1
}
]
}
}
},
"options": {
"colorMode": "background",
"textMode": "value_and_name",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "up{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 2,
"type": "gauge",
"title": "CPU Usage",
"gridPos": {
"h": 6,
"w": 8,
"x": 0,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 60
},
{
"color": "red",
"value": 80
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((ssCpuRawIdle{job=~\"$job\"} / (ssCpuRawUser{job=~\"$job\"} + ssCpuRawSystem{job=~\"$job\"} + ssCpuRawIdle{job=~\"$job\"} + ssCpuRawWait{job=~\"$job\"})) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 3,
"type": "gauge",
"title": "Memory Usage",
"gridPos": {
"h": 6,
"w": 8,
"x": 8,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 90
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "((memTotalReal{job=~\"$job\"} - memAvailReal{job=~\"$job\"}) / memTotalReal{job=~\"$job\"}) * 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 4,
"type": "stat",
"title": "Total Memory",
"gridPos": {
"h": 6,
"w": 8,
"x": 16,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "decbytes",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "blue",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "memTotalReal{job=~\"$job\"} * 1024",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 5,
"type": "timeseries",
"title": "Load Average",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 10
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "laLoad{job=~\"$job\", laIndex=\"1\"}",
"legendFormat": "{{job}} 1m",
"refId": "A"
},
{
"expr": "laLoad{job=~\"$job\", laIndex=\"2\"}",
"legendFormat": "{{job}} 5m",
"refId": "B"
},
{
"expr": "laLoad{job=~\"$job\", laIndex=\"3\"}",
"legendFormat": "{{job}} 15m",
"refId": "C"
}
]
},
{
"id": 6,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 10
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "sysUpTime{job=~\"$job\"} / 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
}
]
}

View File

@@ -0,0 +1,61 @@
# Prometheus & Grafana Monitoring Stack
# Deployed on Homelab VM at ~/docker/monitoring
#
# Usage:
# cd ~/docker/monitoring
# docker-compose up -d
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
networks:
- monitoring
grafana:
image: grafana/grafana-oss:latest
container_name: grafana
restart: unless-stopped
ports:
- "3300:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD="REDACTED_PASSWORD"
volumes:
- grafana-data:/var/lib/grafana
depends_on:
- prometheus
networks:
- monitoring
node_exporter:
image: prom/node-exporter:latest
container_name: node_exporter
restart: unless-stopped
network_mode: host
pid: host
user: nobody
command:
- '--path.rootfs=/host'
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/host:ro,rslave
volumes:
prometheus-data:
grafana-data:
networks:
monitoring:
driver: bridge

View File

@@ -0,0 +1,26 @@
version: "3.8"
services:
node-exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
network_mode: host
pid: host
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
restart: unless-stopped
snmp-exporter:
image: quay.io/prometheus/snmp-exporter:latest
container_name: snmp_exporter
network_mode: host # important, so exporter can talk to DSM SNMP on localhost
volumes:
- /volume1/docker/snmp/snmp.yml:/etc/snmp_exporter/snmp.yml:ro
restart: unless-stopped

View File

@@ -0,0 +1,26 @@
version: "3.8"
services:
node-exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
network_mode: host
pid: host
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
restart: unless-stopped
snmp-exporter:
image: quay.io/prometheus/snmp-exporter:latest
container_name: snmp_exporter
network_mode: host
volumes:
- /volume1/docker/snmp/snmp.yml:/etc/snmp_exporter/snmp.yml:ro
restart: unless-stopped

View File

@@ -0,0 +1,18 @@
version: "3.8"
services:
node-exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
network_mode: host
pid: host
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
restart: unless-stopped

View File

@@ -0,0 +1,18 @@
version: "3.9"
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
network_mode: "host"
pid: "host"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'

View File

@@ -0,0 +1,26 @@
version: "3.8"
services:
node-exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
network_mode: host
pid: host
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
restart: unless-stopped
snmp-exporter:
image: quay.io/prometheus/snmp-exporter:latest
container_name: snmp_exporter
network_mode: host
volumes:
- /volume1/docker/snmp/snmp.yml:/etc/snmp_exporter/snmp.yml:ro
restart: unless-stopped

View File

@@ -0,0 +1,98 @@
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "homelab-node"
static_configs:
- targets: ["100.67.40.126:9100"]
- job_name: "raspberry-pis"
static_configs:
- targets: ["100.77.151.40:9100"] # pi-5
- targets: ["100.123.246.75:9100"] # pi-5-kevin
- job_name: "setillo-node"
static_configs:
- targets: ["100.125.0.20:9100"]
- job_name: "setillo-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.125.0.20:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.125.0.20"
- target_label: __address__
replacement: "100.125.0.20:9116"
- job_name: "calypso-node"
static_configs:
- targets: ["100.103.48.78:9100"]
- job_name: "calypso-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.103.48.78:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.103.48.78"
- target_label: __address__
replacement: "100.103.48.78:9116"
- job_name: "atlantis-node"
static_configs:
- targets: ["100.83.230.112:9100"]
- job_name: "atlantis-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.83.230.112:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.83.230.112"
- target_label: __address__
replacement: "100.83.230.112:9116"
- job_name: "concord-nuc-node"
static_configs:
- targets: ["100.72.55.21:9100"]
- job_name: "truenas-node"
static_configs:
- targets: ["100.75.252.64:9100"]
- job_name: "vmi2076105-node"
static_configs:
- targets: ["100.99.156.20:9100"]
- job_name: "proxmox-node"
static_configs:
- targets: ["100.87.12.28:9100"]

View File

@@ -0,0 +1,582 @@
# Synology SNMP Exporter Configuration
# Comprehensive config for monitoring Synology NAS devices
# Includes: CPU, Memory, Load, Storage, Network, Disks, RAID, Temperature
auths:
snmpv3:
version: 3
security_level: authPriv
auth_protocol: MD5
username: snmp-exporter
password: "REDACTED_PASSWORD"
priv_protocol: DES
priv_password: "REDACTED_PASSWORD"
modules:
synology:
walk:
# Standard MIBs
- 1.3.6.1.2.1.1 # System info (sysDescr, sysUpTime, etc.)
- 1.3.6.1.2.1.2 # Interfaces
- 1.3.6.1.2.1.25.2 # hrStorage (disk/memory usage)
- 1.3.6.1.2.1.25.3.3 # hrProcessorLoad
- 1.3.6.1.2.1.31.1.1 # ifXTable (64-bit counters)
# UCD-SNMP-MIB (CPU, Memory, Load)
- 1.3.6.1.4.1.2021.4 # Memory stats
- 1.3.6.1.4.1.2021.10 # Load average
- 1.3.6.1.4.1.2021.11 # CPU stats
# Synology-specific MIBs
- 1.3.6.1.4.1.6574.1 # System status, temp, power, fans, model
- 1.3.6.1.4.1.6574.2 # Disk information
- 1.3.6.1.4.1.6574.3 # RAID status
- 1.3.6.1.4.1.6574.4 # UPS status
- 1.3.6.1.4.1.6574.5 # Disk SMART info
- 1.3.6.1.4.1.6574.6 # Service users
- 1.3.6.1.4.1.6574.101 # Storage IO
- 1.3.6.1.4.1.6574.102 # Space IO
- 1.3.6.1.4.1.6574.104 # GPU info (if available)
metrics:
# ============================================
# SYSTEM INFO
# ============================================
- name: sysDescr
oid: 1.3.6.1.2.1.1.1
type: DisplayString
help: System description
- name: sysUpTime
oid: 1.3.6.1.2.1.1.3
type: gauge
help: System uptime in hundredths of a second
- name: sysName
oid: 1.3.6.1.2.1.1.5
type: DisplayString
help: System name
# ============================================
# CPU METRICS (UCD-SNMP-MIB)
# ============================================
- name: ssCpuRawUser
oid: 1.3.6.1.4.1.2021.11.50
type: counter
help: Raw CPU user time
- name: ssCpuRawNice
oid: 1.3.6.1.4.1.2021.11.51
type: counter
help: Raw CPU nice time
- name: ssCpuRawSystem
oid: 1.3.6.1.4.1.2021.11.52
type: counter
help: Raw CPU system time
- name: ssCpuRawIdle
oid: 1.3.6.1.4.1.2021.11.53
type: counter
help: Raw CPU idle time
- name: ssCpuRawWait
oid: 1.3.6.1.4.1.2021.11.54
type: counter
help: Raw CPU wait time
- name: ssCpuRawKernel
oid: 1.3.6.1.4.1.2021.11.55
type: counter
help: Raw CPU kernel time
- name: ssCpuRawInterrupt
oid: 1.3.6.1.4.1.2021.11.56
type: counter
help: Raw CPU interrupt time
# ============================================
# MEMORY METRICS (UCD-SNMP-MIB)
# ============================================
- name: memTotalSwap
oid: 1.3.6.1.4.1.2021.4.3
type: gauge
help: Total swap size in KB
- name: memAvailSwap
oid: 1.3.6.1.4.1.2021.4.4
type: gauge
help: Available swap in KB
- name: memTotalReal
oid: 1.3.6.1.4.1.2021.4.5
type: gauge
help: Total RAM in KB
- name: memAvailReal
oid: 1.3.6.1.4.1.2021.4.6
type: gauge
help: Available RAM in KB
- name: memTotalFree
oid: 1.3.6.1.4.1.2021.4.11
type: gauge
help: Total free memory in KB
- name: memShared
oid: 1.3.6.1.4.1.2021.4.13
type: gauge
help: Shared memory in KB
- name: memBuffer
oid: 1.3.6.1.4.1.2021.4.14
type: gauge
help: Buffer memory in KB
- name: memCached
oid: 1.3.6.1.4.1.2021.4.15
type: gauge
help: Cached memory in KB
# ============================================
# LOAD AVERAGE (UCD-SNMP-MIB)
# ============================================
- name: laLoad
oid: 1.3.6.1.4.1.2021.10.1.3
type: DisplayString
help: Load average (1, 5, 15 min)
indexes:
- labelname: laIndex
type: gauge
lookups:
- labels: [laIndex]
labelname: laNames
oid: 1.3.6.1.4.1.2021.10.1.2
type: DisplayString
# ============================================
# HOST RESOURCES - STORAGE
# ============================================
- name: hrStorageDescr
oid: 1.3.6.1.2.1.25.2.3.1.3
type: DisplayString
help: Storage description
indexes:
- labelname: hrStorageIndex
type: gauge
- name: hrStorageAllocationUnits
oid: 1.3.6.1.2.1.25.2.3.1.4
type: gauge
help: Storage allocation unit size in bytes
indexes:
- labelname: hrStorageIndex
type: gauge
lookups:
- labels: [hrStorageIndex]
labelname: hrStorageDescr
oid: 1.3.6.1.2.1.25.2.3.1.3
type: DisplayString
- name: hrStorageSize
oid: 1.3.6.1.2.1.25.2.3.1.5
type: gauge
help: Storage size in allocation units
indexes:
- labelname: hrStorageIndex
type: gauge
lookups:
- labels: [hrStorageIndex]
labelname: hrStorageDescr
oid: 1.3.6.1.2.1.25.2.3.1.3
type: DisplayString
- name: hrStorageUsed
oid: 1.3.6.1.2.1.25.2.3.1.6
type: gauge
help: Storage used in allocation units
indexes:
- labelname: hrStorageIndex
type: gauge
lookups:
- labels: [hrStorageIndex]
labelname: hrStorageDescr
oid: 1.3.6.1.2.1.25.2.3.1.3
type: DisplayString
# ============================================
# NETWORK INTERFACES
# ============================================
- name: ifNumber
oid: 1.3.6.1.2.1.2.1
type: gauge
help: Number of network interfaces
- name: ifDescr
oid: 1.3.6.1.2.1.2.2.1.2
type: DisplayString
help: Interface description
indexes:
- labelname: ifIndex
type: gauge
- name: ifOperStatus
oid: 1.3.6.1.2.1.2.2.1.8
type: gauge
help: Interface operational status (1=up, 2=down)
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels: [ifIndex]
labelname: ifDescr
oid: 1.3.6.1.2.1.2.2.1.2
type: DisplayString
enum_values:
1: up
2: down
3: testing
- name: ifHCInOctets
oid: 1.3.6.1.2.1.31.1.1.1.6
type: counter
help: Total bytes received (64-bit)
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels: [ifIndex]
labelname: ifDescr
oid: 1.3.6.1.2.1.2.2.1.2
type: DisplayString
- name: ifHCOutOctets
oid: 1.3.6.1.2.1.31.1.1.1.10
type: counter
help: Total bytes transmitted (64-bit)
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels: [ifIndex]
labelname: ifDescr
oid: 1.3.6.1.2.1.2.2.1.2
type: DisplayString
# ============================================
# SYNOLOGY SYSTEM STATUS
# ============================================
- name: systemStatus
oid: 1.3.6.1.4.1.6574.1.1
type: gauge
help: System status (1=Normal, 2=Failed)
- name: temperature
oid: 1.3.6.1.4.1.6574.1.2
type: gauge
help: System temperature in Celsius
- name: powerStatus
oid: 1.3.6.1.4.1.6574.1.3
type: gauge
help: Power status (1=Normal, 2=Failed)
- name: systemFanStatus
oid: 1.3.6.1.4.1.6574.1.4.1
type: gauge
help: System fan status (1=Normal, 2=Failed)
- name: cpuFanStatus
oid: 1.3.6.1.4.1.6574.1.4.2
type: gauge
help: CPU fan status (1=Normal, 2=Failed)
- name: modelName
oid: 1.3.6.1.4.1.6574.1.5.1
type: DisplayString
help: NAS model name
- name: serialNumber
oid: 1.3.6.1.4.1.6574.1.5.2
type: DisplayString
help: NAS serial number
- name: version
oid: 1.3.6.1.4.1.6574.1.5.3
type: DisplayString
help: DSM version
- name: REDACTED_APP_PASSWORD
oid: 1.3.6.1.4.1.6574.1.5.4
type: gauge
help: DSM upgrade available (1=available, 2=unavailable)
# ============================================
# SYNOLOGY DISK INFO
# ============================================
- name: diskID
oid: 1.3.6.1.4.1.6574.2.1.1.2
type: DisplayString
help: Disk ID
indexes:
- labelname: diskIndex
type: gauge
- name: diskModel
oid: 1.3.6.1.4.1.6574.2.1.1.3
type: DisplayString
help: Disk model
indexes:
- labelname: diskIndex
type: gauge
lookups:
- labels: [diskIndex]
labelname: diskID
oid: 1.3.6.1.4.1.6574.2.1.1.2
type: DisplayString
- name: diskType
oid: 1.3.6.1.4.1.6574.2.1.1.4
type: DisplayString
help: Disk type (SATA, SSD, etc.)
indexes:
- labelname: diskIndex
type: gauge
lookups:
- labels: [diskIndex]
labelname: diskID
oid: 1.3.6.1.4.1.6574.2.1.1.2
type: DisplayString
- name: diskStatus
oid: 1.3.6.1.4.1.6574.2.1.1.5
type: gauge
help: Disk status (1=Normal, 2=Initialized, 3=NotInitialized, 4=SystemPartitionFailed, 5=Crashed)
indexes:
- labelname: diskIndex
type: gauge
lookups:
- labels: [diskIndex]
labelname: diskID
oid: 1.3.6.1.4.1.6574.2.1.1.2
type: DisplayString
- name: diskTemperature
oid: 1.3.6.1.4.1.6574.2.1.1.6
type: gauge
help: Disk temperature in Celsius
indexes:
- labelname: diskIndex
type: gauge
lookups:
- labels: [diskIndex]
labelname: diskID
oid: 1.3.6.1.4.1.6574.2.1.1.2
type: DisplayString
# ============================================
# SYNOLOGY RAID INFO
# ============================================
- name: raidName
oid: 1.3.6.1.4.1.6574.3.1.1.2
type: DisplayString
help: RAID/Volume name
indexes:
- labelname: raidIndex
type: gauge
- name: raidStatus
oid: 1.3.6.1.4.1.6574.3.1.1.3
type: gauge
help: RAID status (1=Normal, 2=Repairing, 3=Migrating, 4=Expanding, 5=Deleting, 6=Creating, 7=RaidSyncing, 8=RaidParityChecking, 9=RaidAssembling, 10=Canceling, 11=Degrade, 12=Crashed, 13=DataScrubbing, 14=RaidDeploying, 15=RaidUnDeploying, 16=RaidMountCache, 17=REDACTED_APP_PASSWORD, 18=RaidExpandingUnfinishedSHR, 19=RaidConvertSHRToPool, 20=RaidMigrateSHR1ToSHR2, 21=RaidUnknownStatus)
indexes:
- labelname: raidIndex
type: gauge
lookups:
- labels: [raidIndex]
labelname: raidName
oid: 1.3.6.1.4.1.6574.3.1.1.2
type: DisplayString
- name: raidFreeSize
oid: 1.3.6.1.4.1.6574.3.1.1.4
type: gauge
help: RAID free size in bytes
indexes:
- labelname: raidIndex
type: gauge
lookups:
- labels: [raidIndex]
labelname: raidName
oid: 1.3.6.1.4.1.6574.3.1.1.2
type: DisplayString
- name: raidTotalSize
oid: 1.3.6.1.4.1.6574.3.1.1.5
type: gauge
help: RAID total size in bytes
indexes:
- labelname: raidIndex
type: gauge
lookups:
- labels: [raidIndex]
labelname: raidName
oid: 1.3.6.1.4.1.6574.3.1.1.2
type: DisplayString
# ============================================
# SYNOLOGY UPS INFO (if connected)
# ============================================
- name: upsModel
oid: 1.3.6.1.4.1.6574.4.1.1
type: DisplayString
help: UPS model name
- name: upsSN
oid: 1.3.6.1.4.1.6574.4.1.2
type: DisplayString
help: UPS serial number
- name: upsStatus
oid: 1.3.6.1.4.1.6574.4.1.3
type: DisplayString
help: UPS status
- name: upsLoad
oid: 1.3.6.1.4.1.6574.4.2.1
type: gauge
help: UPS load percentage
- name: REDACTED_APP_PASSWORD
oid: 1.3.6.1.4.1.6574.4.3.1.1
type: gauge
help: UPS battery charge percentage
- name: upsBatteryChargeWarning
oid: 1.3.6.1.4.1.6574.4.3.1.2
type: gauge
help: UPS battery charge warning level
# ============================================
# SYNOLOGY SERVICE USERS
# ============================================
- name: serviceName
oid: 1.3.6.1.4.1.6574.6.1.1.2
type: DisplayString
help: Service name
indexes:
- labelname: REDACTED_APP_PASSWORD
type: gauge
- name: serviceUsers
oid: 1.3.6.1.4.1.6574.6.1.1.3
type: gauge
help: Number of users connected to service
indexes:
- labelname: REDACTED_APP_PASSWORD
type: gauge
lookups:
- labels: [serviceInfoIndex]
labelname: serviceName
oid: 1.3.6.1.4.1.6574.6.1.1.2
type: DisplayString
# ============================================
# SYNOLOGY STORAGE IO
# ============================================
- name: storageIODevice
oid: 1.3.6.1.4.1.6574.101.1.1.2
type: DisplayString
help: Storage IO device name
indexes:
- labelname: storageIOIndex
type: gauge
- name: storageIONReadX
oid: 1.3.6.1.4.1.6574.101.1.1.12
type: counter
help: Total bytes read (64-bit)
indexes:
- labelname: storageIOIndex
type: gauge
lookups:
- labels: [storageIOIndex]
labelname: storageIODevice
oid: 1.3.6.1.4.1.6574.101.1.1.2
type: DisplayString
- name: storageIONWrittenX
oid: 1.3.6.1.4.1.6574.101.1.1.13
type: counter
help: Total bytes written (64-bit)
indexes:
- labelname: storageIOIndex
type: gauge
lookups:
- labels: [storageIOIndex]
labelname: storageIODevice
oid: 1.3.6.1.4.1.6574.101.1.1.2
type: DisplayString
- name: storageIOLA
oid: 1.3.6.1.4.1.6574.101.1.1.8
type: gauge
help: Storage IO load average
indexes:
- labelname: storageIOIndex
type: gauge
lookups:
- labels: [storageIOIndex]
labelname: storageIODevice
oid: 1.3.6.1.4.1.6574.101.1.1.2
type: DisplayString
# ============================================
# SYNOLOGY SPACE IO (Volume IO)
# ============================================
- name: spaceIODevice
oid: 1.3.6.1.4.1.6574.102.1.1.2
type: DisplayString
help: Space/Volume IO device name
indexes:
- labelname: spaceIOIndex
type: gauge
- name: spaceIONReadX
oid: 1.3.6.1.4.1.6574.102.1.1.12
type: counter
help: Volume bytes read (64-bit)
indexes:
- labelname: spaceIOIndex
type: gauge
lookups:
- labels: [spaceIOIndex]
labelname: spaceIODevice
oid: 1.3.6.1.4.1.6574.102.1.1.2
type: DisplayString
- name: REDACTED_APP_PASSWORD
oid: 1.3.6.1.4.1.6574.102.1.1.13
type: counter
help: Volume bytes written (64-bit)
indexes:
- labelname: spaceIOIndex
type: gauge
lookups:
- labels: [spaceIOIndex]
labelname: spaceIODevice
oid: 1.3.6.1.4.1.6574.102.1.1.2
type: DisplayString
- name: spaceIOLA
oid: 1.3.6.1.4.1.6574.102.1.1.8
type: gauge
help: Volume IO load average
indexes:
- labelname: spaceIOIndex
type: gauge
lookups:
- labels: [spaceIOIndex]
labelname: spaceIODevice
oid: 1.3.6.1.4.1.6574.102.1.1.2
type: DisplayString

View File

@@ -0,0 +1 @@
1-y71kjkcRGpoNXqSABU07nwduE0jUOrVXVfYOcSPdoZlPuFbKNG1gIPou74HcdqTr

View File

@@ -0,0 +1,62 @@
# Prometheus + Grafana Monitoring Stack
# Ports: 9090 (Prometheus), 3300 (Grafana)
#
# Config files are in prometheus/ and grafana/ subdirectories relative to this file
# Dashboards provisioned: infrastructure-overview, node-details, node-exporter, synology-monitoring
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus:/etc/prometheus
- prometheus-data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--web.enable-lifecycle"
ports:
- "9090:9090"
restart: unless-stopped
networks:
- monitoring
grafana:
image: grafana/grafana-oss:latest
container_name: grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD="REDACTED_PASSWORD"
volumes:
- grafana-data:/var/lib/grafana
- ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources:ro
- ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards:ro
- ./grafana/dashboards:/etc/grafana/dashboards:ro
ports:
- "3300:3000"
restart: unless-stopped
depends_on:
- prometheus
networks:
- monitoring
node_exporter:
image: prom/node-exporter:latest
container_name: node_exporter
network_mode: host
pid: host
volumes:
- /:/host:ro,rslave
- /sys:/host/sys:ro
- /proc:/host/proc:ro
command:
- '--path.rootfs=/host'
restart: unless-stopped
volumes:
prometheus-data:
grafana-data:
networks:
monitoring:
driver: bridge

View File

@@ -0,0 +1,366 @@
{
"uid": "infrastructure-overview-v2",
"title": "Infrastructure Overview - All Devices",
"tags": [
"infrastructure",
"node-exporter",
"tailscale"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"templating": {
"list": [
{
"current": {},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"type": "datasource"
},
{
"allValue": "",
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info, job)",
"hide": 0,
"includeAll": true,
"label": "Host",
"multi": true,
"name": "job",
"query": "label_values(node_uname_info, job)",
"refresh": 1,
"regex": "",
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "stat",
"title": "Device Status",
"gridPos": {
"h": 5,
"w": 24,
"x": 0,
"y": 0
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"mappings": [
{
"type": "value",
"options": {
"0": {
"text": "DOWN",
"color": "red"
},
"1": {
"text": "UP",
"color": "green"
}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 1
}
]
}
}
},
"options": {
"colorMode": "background",
"textMode": "value_and_name",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "up{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 2,
"type": "timeseries",
"title": "CPU Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 5
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "100 - (avg by(job) (rate(node_cpu_seconds_total{mode=\"idle\", job=~\"$job\"}[5m])) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 3,
"type": "timeseries",
"title": "Memory Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 5
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "(1 - (node_memory_MemAvailable_bytes{job=~\"$job\"} / node_memory_MemTotal_bytes{job=~\"$job\"})) * 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 4,
"type": "bargauge",
"title": "Root Disk Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 13
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"displayMode": "gradient",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=~\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"} / node_filesystem_size_bytes{job=~\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"}) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 5,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 13
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_time_seconds{job=~\"$job\"} - node_boot_time_seconds{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 6,
"type": "timeseries",
"title": "Network Receive",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 21
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "sum by(job) (rate(node_network_receive_bytes_total{job=~\"$job\", device!~\"lo|docker.*|br-.*|veth.*\"}[5m]))",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 7,
"type": "timeseries",
"title": "Network Transmit",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 21
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "sum by(job) (rate(node_network_transmit_bytes_total{job=~\"$job\", device!~\"lo|docker.*|br-.*|veth.*\"}[5m]))",
"legendFormat": "{{job}}",
"refId": "A"
}
]
}
]
}

View File

@@ -0,0 +1,936 @@
{
"uid": "node-details-v2",
"title": "Node Details - Full Metrics",
"tags": [
"node-exporter",
"detailed",
"infrastructure"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"time": {
"from": "now-1h",
"to": "now"
},
"templating": {
"list": [
{
"current": {
"selected": false,
"text": "prometheus",
"value": "prometheus"
},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"type": "datasource"
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info, job)",
"hide": 0,
"includeAll": false,
"label": "Host",
"multi": false,
"name": "job",
"options": [],
"query": "label_values(node_uname_info, job)",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(node_uname_info{job=\"$job\"}, instance)",
"hide": 0,
"includeAll": false,
"label": "Instance",
"multi": false,
"name": "instance",
"options": [],
"query": "label_values(node_uname_info{job=\"$job\"}, instance)",
"refresh": 2,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "row",
"title": "\ud83d\udcca Quick Stats",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"collapsed": false
},
{
"id": 2,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 4,
"w": 4,
"x": 0,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_time_seconds{job=\"$job\",instance=\"$instance\"} - node_boot_time_seconds{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Uptime",
"refId": "A"
}
]
},
{
"id": 3,
"type": "stat",
"title": "CPU Cores",
"gridPos": {
"h": 4,
"w": 3,
"x": 4,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "blue",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "count(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"})",
"legendFormat": "Cores",
"refId": "A"
}
]
},
{
"id": 4,
"type": "stat",
"title": "Total RAM",
"gridPos": {
"h": 4,
"w": 3,
"x": 7,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "purple",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "RAM",
"refId": "A"
}
]
},
{
"id": 5,
"type": "gauge",
"title": "CPU",
"gridPos": {
"h": 4,
"w": 3,
"x": 10,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 60
},
{
"color": "red",
"value": 80
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - (avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"}[5m])) * 100)",
"legendFormat": "CPU",
"refId": "A"
}
]
},
{
"id": 6,
"type": "gauge",
"title": "Memory",
"gridPos": {
"h": 4,
"w": 3,
"x": 13,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "(1 - (node_memory_MemAvailable_bytes{job=\"$job\",instance=\"$instance\"} / node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"})) * 100",
"legendFormat": "Memory",
"refId": "A"
}
]
},
{
"id": 7,
"type": "gauge",
"title": "Disk /",
"gridPos": {
"h": 4,
"w": 3,
"x": 16,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=\"$job\",instance=\"$instance\",mountpoint=\"/\",fstype!=\"rootfs\"} / node_filesystem_size_bytes{job=\"$job\",instance=\"$instance\",mountpoint=\"/\",fstype!=\"rootfs\"}) * 100)",
"legendFormat": "Disk",
"refId": "A"
}
]
},
{
"id": 8,
"type": "stat",
"title": "Load 1m",
"gridPos": {
"h": 4,
"w": 2,
"x": 19,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"decimals": 2,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 2
},
{
"color": "red",
"value": 4
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "area",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_load1{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "1m",
"refId": "A"
}
]
},
{
"id": 9,
"type": "stat",
"title": "Load 5m",
"gridPos": {
"h": 4,
"w": 2,
"x": 21,
"y": 1
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"decimals": 2,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 2
},
{
"color": "red",
"value": 4
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "area",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "node_load5{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "5m",
"refId": "A"
}
]
},
{
"id": 10,
"type": "row",
"title": "\ud83d\udda5\ufe0f CPU Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 5
},
"collapsed": false
},
{
"id": 11,
"type": "timeseries",
"title": "CPU Usage Breakdown",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 6
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"custom": {
"fillOpacity": 50,
"stacking": {
"mode": "normal",
"group": "A"
}
}
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"user\"}[5m])) * 100",
"legendFormat": "User",
"refId": "A"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"system\"}[5m])) * 100",
"legendFormat": "System",
"refId": "B"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"iowait\"}[5m])) * 100",
"legendFormat": "IOWait",
"refId": "C"
},
{
"expr": "avg(rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"steal\"}[5m])) * 100",
"legendFormat": "Steal",
"refId": "D"
}
]
},
{
"id": 12,
"type": "timeseries",
"title": "CPU Per Core",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 6
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "100 - (rate(node_cpu_seconds_total{job=\"$job\",instance=\"$instance\",mode=\"idle\"}[5m]) * 100)",
"legendFormat": "CPU {{cpu}}",
"refId": "A"
}
]
},
{
"id": 20,
"type": "row",
"title": "\ud83e\udde0 Memory Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 14
},
"collapsed": false
},
{
"id": 21,
"type": "timeseries",
"title": "Memory Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 15
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes",
"custom": {
"fillOpacity": 30,
"stacking": {
"mode": "normal",
"group": "A"
}
}
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "node_memory_MemTotal_bytes{job=\"$job\",instance=\"$instance\"} - node_memory_MemAvailable_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Used",
"refId": "A"
},
{
"expr": "node_memory_Buffers_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Buffers",
"refId": "B"
},
{
"expr": "node_memory_Cached_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Cached",
"refId": "C"
},
{
"expr": "node_memory_MemFree_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Free",
"refId": "D"
}
]
},
{
"id": 22,
"type": "timeseries",
"title": "Swap Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 15
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bytes"
}
},
"targets": [
{
"expr": "node_memory_SwapTotal_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Total",
"refId": "A"
},
{
"expr": "node_memory_SwapTotal_bytes{job=\"$job\",instance=\"$instance\"} - node_memory_SwapFree_bytes{job=\"$job\",instance=\"$instance\"}",
"legendFormat": "Used",
"refId": "B"
}
]
},
{
"id": 30,
"type": "row",
"title": "\ud83d\udcbe Disk Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 23
},
"collapsed": false
},
{
"id": 31,
"type": "bargauge",
"title": "Disk Space Usage",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 24
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 85
}
]
}
}
},
"options": {
"displayMode": "gradient",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{job=\"$job\",instance=\"$instance\",fstype!~\"tmpfs|overlay|squashfs\"} / node_filesystem_size_bytes{job=\"$job\",instance=\"$instance\",fstype!~\"tmpfs|overlay|squashfs\"}) * 100)",
"legendFormat": "{{mountpoint}}",
"refId": "A"
}
]
},
{
"id": 32,
"type": "timeseries",
"title": "Disk I/O",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 24
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "Bps"
},
"overrides": [
{
"matcher": {
"id": "byRegexp",
"options": ".*Write.*"
},
"properties": [
{
"id": "custom.transform",
"value": "negative-Y"
}
]
}
]
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "rate(node_disk_read_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"loop.*|dm-.*\"}[5m])",
"legendFormat": "{{device}} Read",
"refId": "A"
},
{
"expr": "rate(node_disk_written_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"loop.*|dm-.*\"}[5m])",
"legendFormat": "{{device}} Write",
"refId": "B"
}
]
},
{
"id": 40,
"type": "row",
"title": "\ud83c\udf10 Network Details",
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 32
},
"collapsed": false
},
{
"id": 41,
"type": "timeseries",
"title": "Network Traffic",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 33
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "bps"
},
"overrides": [
{
"matcher": {
"id": "byRegexp",
"options": ".*TX.*"
},
"properties": [
{
"id": "custom.transform",
"value": "negative-Y"
}
]
}
]
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean",
"max"
]
}
},
"targets": [
{
"expr": "rate(node_network_receive_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m]) * 8",
"legendFormat": "{{device}} RX",
"refId": "A"
},
{
"expr": "rate(node_network_transmit_bytes_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m]) * 8",
"legendFormat": "{{device}} TX",
"refId": "B"
}
]
},
{
"id": 42,
"type": "timeseries",
"title": "Network Errors",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 33
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "pps"
}
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "rate(node_network_receive_errs_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m])",
"legendFormat": "{{device}} RX Errors",
"refId": "A"
},
{
"expr": "rate(node_network_transmit_errs_total{job=\"$job\",instance=\"$instance\",device!~\"lo|docker.*|br-.*|veth.*\"}[5m])",
"legendFormat": "{{device}} TX Errors",
"refId": "B"
}
]
}
],
"id": null
}

View File

@@ -0,0 +1,351 @@
{
"uid": "synology-dashboard-v2",
"title": "Synology NAS Monitoring",
"tags": [
"synology",
"nas",
"snmp"
],
"timezone": "browser",
"schemaVersion": 38,
"version": 1,
"refresh": "30s",
"templating": {
"list": [
{
"current": {},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"multi": false,
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"type": "datasource"
},
{
"allValue": "",
"current": {},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"definition": "label_values(ssCpuRawIdle, job)",
"hide": 0,
"includeAll": true,
"label": "NAS",
"multi": true,
"name": "job",
"query": "label_values(ssCpuRawIdle, job)",
"refresh": 1,
"regex": "",
"sort": 1,
"type": "query"
}
]
},
"panels": [
{
"id": 1,
"type": "stat",
"title": "NAS Status",
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 0
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"mappings": [
{
"type": "value",
"options": {
"0": {
"text": "DOWN",
"color": "red"
},
"1": {
"text": "UP",
"color": "green"
}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 1
}
]
}
}
},
"options": {
"colorMode": "background",
"textMode": "value_and_name",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "up{job=~\"$job\"}",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 2,
"type": "gauge",
"title": "CPU Usage",
"gridPos": {
"h": 6,
"w": 8,
"x": 0,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 60
},
{
"color": "red",
"value": 80
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "100 - ((ssCpuRawIdle{job=~\"$job\"} / (ssCpuRawUser{job=~\"$job\"} + ssCpuRawSystem{job=~\"$job\"} + ssCpuRawIdle{job=~\"$job\"} + ssCpuRawWait{job=~\"$job\"})) * 100)",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 3,
"type": "gauge",
"title": "Memory Usage",
"gridPos": {
"h": 6,
"w": 8,
"x": 8,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "percent",
"min": 0,
"max": 100,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 70
},
{
"color": "red",
"value": 90
}
]
}
}
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "((memTotalReal{job=~\"$job\"} - memAvailReal{job=~\"$job\"}) / memTotalReal{job=~\"$job\"}) * 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 4,
"type": "stat",
"title": "Total Memory",
"gridPos": {
"h": 6,
"w": 8,
"x": 16,
"y": 4
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "decbytes",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "blue",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"graphMode": "none",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "memTotalReal{job=~\"$job\"} * 1024",
"legendFormat": "{{job}}",
"refId": "A"
}
]
},
{
"id": 5,
"type": "timeseries",
"title": "Load Average",
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 10
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"calcs": [
"mean"
]
}
},
"targets": [
{
"expr": "laLoad{job=~\"$job\", laIndex=\"1\"}",
"legendFormat": "{{job}} 1m",
"refId": "A"
},
{
"expr": "laLoad{job=~\"$job\", laIndex=\"2\"}",
"legendFormat": "{{job}} 5m",
"refId": "B"
},
{
"expr": "laLoad{job=~\"$job\", laIndex=\"3\"}",
"legendFormat": "{{job}} 15m",
"refId": "C"
}
]
},
{
"id": 6,
"type": "stat",
"title": "Uptime",
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 10
},
"datasource": {
"type": "prometheus",
"uid": "eeyq1w1zddtkwb"
},
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
}
},
"options": {
"colorMode": "value",
"orientation": "horizontal",
"reduceOptions": {
"calcs": [
"lastNotNull"
]
}
},
"targets": [
{
"expr": "sysUpTime{job=~\"$job\"} / 100",
"legendFormat": "{{job}}",
"refId": "A"
}
]
}
]
}

View File

@@ -0,0 +1,13 @@
apiVersion: 1
providers:
- name: 'Homelab Dashboards'
orgId: 1
folder: ''
folderUid: ''
type: file
disableDeletion: false
updateIntervalSeconds: 30
allowUiUpdates: true
options:
path: /etc/grafana/dashboards

View File

@@ -0,0 +1,9 @@
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: false

View File

@@ -0,0 +1,98 @@
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "homelab-node"
static_configs:
- targets: ["100.67.40.126:9100"]
- job_name: "raspberry-pis"
static_configs:
- targets: ["100.77.151.40:9100"] # pi-5
- targets: ["100.123.246.75:9100"] # pi-5-kevin
- job_name: "setillo-node"
static_configs:
- targets: ["100.125.0.20:9100"]
- job_name: "setillo-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.125.0.20:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.125.0.20"
- target_label: __address__
replacement: "100.125.0.20:9116"
- job_name: "calypso-node"
static_configs:
- targets: ["100.103.48.78:9100"]
- job_name: "calypso-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.103.48.78:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.103.48.78"
- target_label: __address__
replacement: "100.103.48.78:9116"
- job_name: "atlantis-node"
static_configs:
- targets: ["100.83.230.112:9100"]
- job_name: "atlantis-snmp"
metrics_path: /snmp
params:
module: [synology]
auth: [snmpv3]
target: ["127.0.0.1"]
static_configs:
- targets: ["100.83.230.112:9116"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: "127.0.0.1"
- source_labels: [__param_target]
target_label: instance
replacement: "100.83.230.112"
- target_label: __address__
replacement: "100.83.230.112:9116"
- job_name: "concord-nuc-node"
static_configs:
- targets: ["100.72.55.21:9100"]
- job_name: "truenas-node"
static_configs:
- targets: ["100.75.252.64:9100"]
- job_name: "vmi2076105-node"
static_configs:
- targets: ["100.99.156.20:9100"]
- job_name: "proxmox-node"
static_configs:
- targets: ["100.87.12.28:9100"]

View File

@@ -0,0 +1,67 @@
# DokuWiki Documentation Format
This directory contains the homelab documentation formatted for DokuWiki. DokuWiki uses a different syntax than standard Markdown.
## 📁 File Structure
- `start.txt` - Main documentation index page
- `services-popular.txt` - Popular services guide
- `services-individual-index.txt` - **NEW!** Complete index of all 159 individual service docs
- `getting-started-quick-start.txt` - Quick start guide
## 🔧 How to Use
### Option 1: Copy Individual Files
1. Copy the `.txt` files to your DokuWiki `data/pages/` directory
2. Create appropriate subdirectories (e.g., `services/`, `getting-started/`)
3. Access via your DokuWiki web interface
### Option 2: Bulk Import
1. Create the following directory structure in your DokuWiki:
```
data/pages/homelab/
├── start.txt
├── services/
│ └── popular.txt
├── getting-started/
├── infrastructure/
├── admin/
├── troubleshooting/
└── advanced/
```
2. Copy files to appropriate directories
3. Access at `http://your-dokuwiki/doku.php?id=homelab:start`
## 🎨 DokuWiki Syntax Used
- `======` for main headings
- `=====` for subheadings
- `====` for sub-subheadings
- `^` for table headers
- `|` for table cells
- `[[namespace:page|Link Text]]` for internal links
- `<code>` blocks for code examples
- `//italic//` and `**bold**` for emphasis
## 🔄 Converting from Markdown
Key differences from Markdown:
- Headers use `=` instead of `#`
- Tables use `^` for headers and `|` for cells
- Links use `[[]]` syntax
- Code blocks use `<code>` tags
- Lists use ` *` (two spaces + asterisk)
## 📝 Customization
You can customize these files for your DokuWiki installation:
- Update internal links to match your namespace structure
- Modify styling and formatting as needed
- Add your own branding or additional content
## 🔗 Related
- Main documentation: `../docs/`
- Joplin format: `../joplin/`
- Original repository structure: `../`

View File

@@ -0,0 +1,322 @@
====== Quick Start Guide ======
**🟢 Beginner-Friendly**
Get up and running with your first homelab service in under 30 minutes! This guide will walk you through deploying a simple service using the established patterns from this homelab.
===== What We'll Build =====
We'll deploy **Uptime Kuma** - a simple, beginner-friendly monitoring tool that will:
* Monitor your other services
* Send you alerts when things go down
* Provide a beautiful dashboard
* Teach you the basic deployment patterns
===== Prerequisites =====
==== What You Need ====
* A computer running Linux (Ubuntu, Debian, or similar)
* Docker and Docker Compose installed
* Basic command line knowledge
* 30 minutes of time
==== Install Docker (if needed) ====
<code bash>
# Update system
sudo apt update && sudo apt upgrade -y
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add your user to docker group
sudo usermod -aG docker $USER
# Install Docker Compose
sudo apt install docker-compose -y
# Verify installation
docker --version
docker-compose --version
</code>
===== Step 1: Create Project Structure =====
<code bash>
# Create project directory
mkdir -p ~/homelab/monitoring
cd ~/homelab/monitoring
# Create the directory structure
mkdir -p uptime-kuma/data
</code>
===== Step 2: Create Docker Compose File =====
Create the main configuration file:
<code bash>
cat > uptime-kuma/docker-compose.yml << 'EOF'
version: '3.9'
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: Uptime-Kuma
hostname: uptime-kuma
# Security settings
security_opt:
- no-new-privileges:true
user: 1000:1000 # Adjust for your system
# Health check
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3001/api/status-page/heartbeat/default"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# Restart policy
restart: on-failure:5
# Resource limits
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
# Port mapping
ports:
- "3001:3001"
# Data persistence
volumes:
- ./data:/app/data:rw
- /etc/localtime:/etc/localtime:ro
# Environment variables
environment:
- TZ=America/Los_Angeles # Change to your timezone
# Custom network
networks:
- monitoring-network
networks:
monitoring-network:
name: monitoring-network
ipam:
config:
- subnet: 192.168.100.0/24
EOF
</code>
===== Step 3: Configure Environment =====
Create an environment file for easy customization:
<code bash>
cat > uptime-kuma/.env << 'EOF'
# Timezone (change to your location)
TZ=America/Los_Angeles
# User ID and Group ID (run 'id' command to find yours)
PUID=1000
PGID=1000
# Port (change if 3001 is already in use)
PORT=3001
EOF
</code>
===== Step 4: Deploy the Service =====
<code bash>
# Navigate to the service directory
cd uptime-kuma
# Start the service
docker-compose up -d
# Check if it's running
docker-compose ps
# View logs
docker-compose logs -f
</code>
You should see output like:
<code>
uptime-kuma_1 | Welcome to Uptime Kuma
uptime-kuma_1 | Server is running on port 3001
</code>
===== Step 5: Access Your Service =====
- **Open your web browser**
- **Navigate to**: ''http://your-server-ip:3001''
- **Create admin account** on first visit
- **Start monitoring services!**
===== Step 6: Add Your First Monitor =====
- **Click "Add New Monitor"**
- **Configure a basic HTTP monitor**:
* **Monitor Type**: HTTP(s)
* **Friendly Name**: Google
* **URL**: https://google.com
* **Heartbeat Interval**: 60 seconds
- **Click "Save"**
Congratulations! You've deployed your first homelab service! 🎉
===== Understanding What We Built =====
==== Docker Compose Structure ====
<code yaml>
# This tells Docker what version of compose syntax we're using
version: '3.9'
# Services section defines our containers
services:
uptime-kuma: # Service name
image: louislam/uptime-kuma # Docker image to use
container_name: Uptime-Kuma # Custom container name
ports: # Port mapping (host:container)
- "3001:3001"
volumes: # Data persistence
- ./data:/app/data:rw # Maps local ./data to container /app/data
environment: # Environment variables
- TZ=America/Los_Angeles
</code>
==== Security Features ====
* **no-new-privileges**: Prevents privilege escalation
* **User mapping**: Runs as non-root user
* **Resource limits**: Prevents resource exhaustion
* **Health checks**: Monitors service health
==== Monitoring Features ====
* **Health checks**: Docker monitors the container
* **Restart policy**: Automatically restarts on failure
* **Logging**: All output captured by Docker
===== Next Steps - Expand Your Homelab =====
==== 🟢 Beginner Services (Try Next) ====
- **Pi-hole** - Block ads network-wide
<code bash>
# Copy the uptime-kuma pattern and adapt for Pi-hole
mkdir ~/homelab/pihole
# Use the Pi-hole configuration from Atlantis/pihole.yml
</code>
- **Portainer** - Manage Docker containers with a web UI
<code bash>
mkdir ~/homelab/portainer
# Adapt the pattern for Portainer
</code>
- **Nginx Proxy Manager** - Manage reverse proxy with SSL
<code bash>
mkdir ~/homelab/proxy
# Use the pattern from Atlantis/nginxproxymanager/
</code>
==== 🟡 Intermediate Services (When Ready) ====
- **Plex or Jellyfin** - Media streaming
- **Vaultwarden** - Password manager
- **Grafana + Prometheus** - Advanced monitoring
==== 🔴 Advanced Services (For Later) ====
- **GitLab** - Complete DevOps platform
- **Home Assistant** - Smart home automation
- **Matrix Synapse** - Decentralized chat
===== Common Customizations =====
==== Change the Port ====
If port 3001 is already in use:
<code yaml>
ports:
- "3002:3001" # Use port 3002 instead
</code>
==== Different Data Location ====
To store data elsewhere:
<code yaml>
volumes:
- /home/user/uptime-data:/app/data:rw
</code>
==== Add Resource Limits ====
For a more powerful server:
<code yaml>
deploy:
resources:
limits:
memory: 1G
cpus: '1.0'
</code>
===== Troubleshooting =====
==== Service Won't Start ====
<code bash>
# Check logs for errors
docker-compose logs
# Check if port is already in use
sudo netstat -tulpn | grep :3001
# Check file permissions
ls -la data/
</code>
==== Can't Access Web Interface ====
<code bash>
# Check if container is running
docker ps
# Test internal connectivity
docker exec Uptime-Kuma curl http://localhost:3001
# Check firewall
sudo ufw status
sudo ufw allow 3001
</code>
==== Data Not Persisting ====
<code bash>
# Check volume mount
docker inspect Uptime-Kuma | grep -A 10 Mounts
# Fix permissions
sudo chown -R 1000:1000 ./data
</code>
===== What You've Learned =====
✅ **Docker Compose basics**\\
✅ **Service deployment patterns**\\
✅ **Data persistence with volumes**\\
✅ **Network configuration**\\
✅ **Security best practices**\\
✅ **Health monitoring**\\
✅ **Troubleshooting basics**\\
===== Next Reading =====
* [[getting-started:architecture|Architecture Overview]]: Understand how everything fits together
* [[services:categories|Service Categories]]: Explore what services are available
* [[admin:deployment|Deployment Guide]]: Learn advanced deployment patterns
* [[troubleshooting:common-issues|Common Issues]]: Troubleshoot problems
----
**🎉 Congratulations!** You've successfully deployed your first homelab service using the same patterns used across all 176 services in this infrastructure. You're now ready to explore more complex services and build your own homelab empire!
//Remember: Every expert was once a beginner. Start small, learn continuously, and don't be afraid to break things - that's how you learn!//

View File

@@ -0,0 +1,510 @@
====== 🔌 Port Forwarding Configuration ======
**🟡 Intermediate Infrastructure Guide**
This document details the current port forwarding configuration on the TP-Link Archer BE800 router, enabling external access to specific homelab services with automatic DDNS updates every 5 minutes.
<WRAP center round info 60%>
**🌐 Automatic Domain Updates**\\
All domains are automatically updated via Cloudflare DDNS every 5 minutes, eliminating the need for manual IP management.
</WRAP>
===== 🔧 Current Port Forwarding Rules =====
Based on the TP-Link Archer BE800 router configuration:
==== 📊 Active Port Forwards Summary ====
^ Service Name ^ Device IP ^ External Port ^ Internal Port ^ Protocol ^ Domain Access ^
| **jitsi3** | 192.168.0.200 | 4443 | 4443 | TCP | meet.thevish.io:4443 |
| **stun3** | 192.168.0.200 | 5349 | 5349 | All | meet.thevish.io:5349 |
| **stun2** | 192.168.0.200 | 49160-49200 | 49160-49200 | All | meet.thevish.io (RTP) |
| **stun1** | 192.168.0.200 | 3478 | 3478 | All | meet.thevish.io:3478 |
| **gitea** | 192.168.0.250 | 2222 | 2222 | All | git.vish.gg:2222 |
| **portainer2** | 192.168.0.200 | 8000 | 8000 | All | pw.vish.gg:8000 |
| **portainer2** | 192.168.0.200 | 9443 | 9443 | All | pw.vish.gg:9443 |
| **portainer2** | 192.168.0.200 | 10000 | 10000 | All | pw.vish.gg:10000 |
| **Https** | 192.168.0.250 | 443 | 443 | All | vish.gg:443 |
| **HTTP** | 192.168.0.250 | 80 | 80 | All | vish.gg:80 |
===== 🎯 Service Dependencies & External Access =====
==== 🎥 Jitsi Meet Video Conferencing (192.168.0.200 - Atlantis) ====
=== External Access URLs ===
<code>
https://meet.thevish.io:4443 # Primary Jitsi Meet web interface
https://meet.vish.gg:4443 # Alternative domain access
</code>
=== Required Port Configuration ===
^ Port ^ Protocol ^ Purpose ^ Critical ^
| 4443 | TCP | HTTPS web interface | ✅ Essential |
| 5349 | All | TURN server for NAT traversal | ✅ Essential |
| 3478 | All | STUN server for peer discovery | ✅ Essential |
| 49160-49200 | All | RTP media streams (40 port range) | ✅ Essential |
=== Service Dependencies ===
<code>
# WebRTC Media Flow
Internet → Router:4443 → Atlantis:5443 → jitsi-web:443
Internet → Router:3478 → Atlantis:3478 → STUN server
Internet → Router:5349 → Atlantis:5349 → TURN server
Internet → Router:49160-49200 → Atlantis:49160-49200 → RTP streams
# All 4 port ranges required for full functionality:
- WebRTC media negotiation depends on STUN/TURN
- RTP port range handles multiple concurrent calls
- HTTPS interface provides web-based meeting access
</code>
==== 📝 Gitea Git Repository (192.168.0.250 - Calypso) ====
=== External Access URLs ===
<code>
# SSH Git Operations
ssh://git@git.vish.gg:2222
# Web Interface
https://git.vish.gg
# Git Commands
git clone ssh://git@git.vish.gg:2222/username/repo.git
git remote add origin ssh://git@git.vish.gg:2222/username/repo.git
git push origin main
</code>
=== Port Configuration ===
^ Port ^ Protocol ^ Purpose ^ Authentication ^
| 2222 | All | SSH access for Git operations | SSH Keys Required |
=== Service Dependencies ===
<code>
# SSH Git Access Flow
Internet → Router:2222 → Calypso:2222 → gitea:22
# Requirements:
- SSH key authentication required
- Alternative to HTTPS Git access
- Enables Git operations from external networks
- Web interface accessible via reverse proxy on port 443
</code>
==== 🐳 Portainer Container Management (192.168.0.200 - Atlantis) ====
=== External Access URLs ===
<code>
https://pw.vish.gg:9443 # Primary Portainer HTTPS interface
https://vish.gg:9443 # Alternative domain access
https://pw.vish.gg:8000 # Edge Agent communication
https://pw.vish.gg:10000 # Additional services
</code>
=== Port Configuration ===
^ Port ^ Protocol ^ Purpose ^ Security Level ^
| 9443 | All | Primary HTTPS interface | 🔒 High |
| 8000 | All | Edge Agent communication | ⚠️ Medium |
| 10000 | All | Extended functionality | ⚠️ Medium |
=== Service Dependencies ===
<code>
# Container Management Flow
Internet → Router:9443 → Atlantis:9443 → portainer:9443
Internet → Router:8000 → Atlantis:8000 → portainer:8000
Internet → Router:10000 → Atlantis:10000 → portainer:10000
# All three ports required for full Portainer functionality:
- 9443: Primary HTTPS interface for web management
- 8000: Edge Agent enables remote Docker management
- 10000: Extended functionality and additional services
</code>
==== 🌍 Web Services (192.168.0.250 - Calypso) ====
=== External Access URLs ===
<code>
https://vish.gg # Main web services (HTTPS)
https://www.vish.gg # WWW subdomain
http://vish.gg # HTTP (redirects to HTTPS)
# Additional Cloudflare Proxied Services:
https://cal.vish.gg # Calendar service
https://reddit.vish.gg # Reddit alternative
https://matrix.thevish.io # Matrix chat server
https://joplin.thevish.io # Joplin notes
https://www.thevish.io # Alternative main domain
</code>
=== Port Configuration ===
^ Port ^ Protocol ^ Purpose ^ Redirect ^
| 443 | All | HTTPS web services | Primary |
| 80 | All | HTTP (redirects to HTTPS) | → 443 |
=== Service Dependencies ===
<code>
# Web Services Flow
Internet → Router:443 → Calypso:443 → nginx:443
Internet → Router:80 → Calypso:80 → nginx:80 → redirect to 443
# Requirements:
- Reverse proxy (Nginx) on Calypso handles routing
- SSL/TLS certificates for HTTPS (Let's Encrypt)
- Automatic HTTP to HTTPS redirection
- Cloudflare proxy protection for some subdomains
</code>
===== 🏠 Host Mapping & Service Distribution =====
==== 📊 Services by Host ====
^ Host ^ IP Address ^ Services ^ Port Forwards ^ Primary Function ^
| **Atlantis** | 192.168.0.200 | 45 services | 4 forwards | Jitsi Meet, Portainer |
| **Calypso** | 192.168.0.250 | 38 services | 3 forwards | Gitea SSH, Web Services |
==== 🔌 Port Forward Distribution ====
=== Atlantis (192.168.0.200) ===
* **Jitsi Meet Video Conferencing**: 4 port forwards
* 4443/TCP: HTTPS web interface
* 5349/All: TURN server
* 49160-49200/All: RTP media (40 ports)
* 3478/All: STUN server
* **Portainer Container Management**: 3 port forwards
* 9443/All: HTTPS interface
* 8000/All: Edge Agent
* 10000/All: Additional services
=== Calypso (192.168.0.250) ===
* **Gitea Git Repository**: 1 port forward
* 2222/All: SSH Git access
* **Web Services**: 2 port forwards
* 443/All: HTTPS web services
* 80/All: HTTP (redirects to HTTPS)
===== 🔒 Security Analysis & Risk Assessment =====
==== ✅ High Security Services ====
^ Service ^ Port ^ Security Features ^ Risk Level ^
| **HTTPS Web (443)** | 443 | Encrypted traffic, reverse proxy protected | 🟢 Low |
| **Jitsi Meet (4443)** | 4443 | Encrypted video conferencing, HTTPS | 🟢 Low |
| **Portainer HTTPS (9443)** | 9443 | Encrypted container management | 🟢 Low |
==== ⚠️ Medium Security Services ====
^ Service ^ Port ^ Security Considerations ^ Recommendations ^
| **Gitea SSH (2222)** | 2222 | SSH key authentication required | Monitor access logs |
| **Portainer Edge (8000)** | 8000 | Agent communication, should be secured | Implement IP restrictions |
| **HTTP (80)** | 80 | Unencrypted, should redirect to HTTPS | Verify redirect works |
==== 🔧 Network Services ====
^ Service ^ Ports ^ Protocol Type ^ Security Notes ^
| **STUN/TURN** | 3478, 5349 | Standard WebRTC protocols | Industry standard, encrypted by Jitsi |
| **RTP Media** | 49160-49200 | Media streams | Encrypted by Jitsi, 40 port range |
==== 🛡️ Security Recommendations ====
=== Authentication & Access Control ===
<code>
# 1. Strong Authentication
- SSH keys for Gitea (port 2222) - disable password auth
- 2FA on Portainer (port 9443) - enable for all users
- Strong passwords on all web services
- Regular credential rotation
# 2. Access Monitoring
- Review Nginx/reverse proxy logs regularly
- Monitor failed authentication attempts
- Set up alerts for suspicious activity
- Log SSH access attempts on port 2222
# 3. Network Security
- Consider IP whitelisting for admin services
- Implement rate limiting on web interfaces
- Use VPN (Tailscale) for administrative access
- Regular security updates for all exposed services
</code>
=== Service Hardening ===
<code>
# 4. Service Security
- Keep all exposed services updated
- Monitor CVE databases for vulnerabilities
- Implement automated security scanning
- Regular backup of service configurations
# 5. Network Segmentation
- Consider moving exposed services to DMZ
- Implement firewall rules between network segments
- Use VLANs to isolate public-facing services
- Monitor inter-service communication
</code>
===== 🌐 External Access Methods & Alternatives =====
==== 🔌 Primary Access (Port Forwarding) ====
<code>
# Direct external access via domain names (DDNS updated every 5 minutes)
https://pw.vish.gg:9443 # Portainer
https://meet.thevish.io:4443 # Jitsi Meet (primary)
ssh://git@git.vish.gg:2222 # Gitea SSH
# Alternative domain access
https://vish.gg:9443 # Portainer (main domain)
https://meet.vish.gg:4443 # Jitsi Meet (alt domain)
https://www.vish.gg # Main web services (HTTPS)
https://vish.gg # Main web services (HTTPS)
# Additional service domains (from Cloudflare DNS)
https://cal.vish.gg # Calendar service (proxied)
https://reddit.vish.gg # Reddit alternative (proxied)
https://www.thevish.io # Alternative main domain (proxied)
https://matrix.thevish.io # Matrix chat server (proxied)
https://joplin.thevish.io # Joplin notes (proxied)
</code>
==== 🔗 Alternative Access (Tailscale VPN) ====
<code>
# Secure mesh VPN access (recommended for admin)
https://atlantis.tail.vish.gg:9443 # Portainer via Tailscale
https://atlantis.tail.vish.gg:4443 # Jitsi via Tailscale
ssh://git@calypso.tail.vish.gg:2222 # Gitea via Tailscale
# Benefits of Tailscale access:
- No port forwarding required
- End-to-end encryption
- Access control via Tailscale ACLs
- No exposure to internet threats
</code>
==== 🔄 Hybrid Approach (Recommended) ====
<code>
# Public Services (External Access)
- Jitsi Meet: External users need direct access
- Web Services: Public content via port forwarding
- Git Repository: Public repositories via HTTPS
# Admin Services (Tailscale Access)
- Portainer: Container management via VPN
- Gitea Admin: Administrative functions via VPN
- Monitoring: Grafana, Prometheus via VPN
</code>
===== 🔄 Dynamic DNS (DDNS) Configuration =====
==== 🌐 Automated DDNS Updates ====
<code>
# Cloudflare DDNS Configuration
- Update Frequency: Every 5 minutes
- Domains: vish.gg and thevish.io
- Record Types: IPv4 (A) and IPv6 (AAAA)
- Automation: 4 DDNS services running
# DDNS Services:
- ddns-vish-proxied: Updates proxied A records for vish.gg
- ddns-vish-unproxied: Updates DNS-only A records for vish.gg
- ddns-thevish-proxied: Updates proxied records for thevish.io
- ddns-thevish-unproxied: Updates DNS-only records for thevish.io
</code>
==== 📊 Service Categories ====
<code>
# Proxied Services (Cloudflare Protection)
- cal.vish.gg, reddit.vish.gg, www.vish.gg
- matrix.thevish.io, joplin.thevish.io, www.thevish.io
- Benefits: DDoS protection, caching, SSL termination
# DNS-Only Services (Direct Access)
- git.vish.gg, meet.thevish.io, pw.vish.gg
- api.vish.gg, spotify.vish.gg
- Benefits: Direct connection, no proxy overhead
</code>
===== 🚨 Troubleshooting & Diagnostics =====
==== 🔍 Common Issues & Solutions ====
=== Service Not Accessible Externally ===
<code>
# Diagnostic Steps:
1. Verify port forward rule is enabled in router
2. Confirm internal service is running on host
3. Test internal access first (192.168.0.x:port)
4. Check firewall rules on target host
5. Verify router external IP hasn't changed
6. Test DNS resolution: nslookup domain.com
# Commands:
docker-compose ps # Check service status
netstat -tulpn | grep PORT # Verify port binding
nmap -p PORT domain.com # Test external access
curl -I https://domain.com # HTTP connectivity test
</code>
=== Jitsi Meet Connection Issues ===
<code>
# WebRTC requires all ports - test each:
nmap -p 4443 meet.thevish.io # Web interface
nmap -p 3478 meet.thevish.io # STUN server
nmap -p 5349 meet.thevish.io # TURN server
nmap -p 49160-49200 meet.thevish.io # RTP range
# Browser diagnostics:
1. Open browser developer tools
2. Go to Network tab during call
3. Look for STUN/TURN connection attempts
4. Check for WebRTC errors in console
5. Test with different networks/devices
</code>
=== Gitea SSH Access Problems ===
<code>
# SSH troubleshooting steps:
ssh -p 2222 git@git.vish.gg # Test SSH connection
ssh-add -l # Check loaded SSH keys
cat ~/.ssh/id_rsa.pub # Verify public key
nmap -p 2222 git.vish.gg # Test port accessibility
# Gitea-specific checks:
docker-compose logs gitea | grep ssh
# Check Gitea SSH configuration in admin panel
# Verify SSH key is added to Gitea user account
</code>
=== Portainer Access Issues ===
<code>
# Test all Portainer ports:
curl -I https://pw.vish.gg:9443 # Main interface
curl -I https://pw.vish.gg:8000 # Edge Agent
curl -I https://pw.vish.gg:10000 # Additional services
# Container diagnostics:
docker-compose logs portainer
docker stats portainer
# Check Portainer logs for authentication errors
</code>
==== 🔧 Performance Optimization ====
=== Network Performance ===
<code>
# Monitor bandwidth usage:
iftop -i eth0 # Real-time bandwidth
vnstat -i eth0 # Historical usage
speedtest-cli # Internet speed test
# Optimize for concurrent users:
# Jitsi: Increase JVB memory allocation
# Gitea: Configure Git LFS for large files
# Portainer: Increase container resources
</code>
=== Service Performance ===
<code>
# Resource monitoring:
docker stats # Container resource usage
htop # System resource usage
df -h # Disk space usage
# Service-specific optimization:
# Jitsi: Configure for expected concurrent meetings
# Nginx: Enable gzip compression and caching
# Database: Optimize PostgreSQL settings
</code>
===== 📋 Maintenance & Configuration Management =====
==== 🔄 Regular Maintenance Tasks ====
=== Monthly Tasks ===
<code>
# Security and monitoring:
□ Review access logs for all forwarded services
□ Test external access to all forwarded ports
□ Update service passwords and SSH keys
□ Backup router configuration
□ Verify DDNS updates are working
□ Check SSL certificate expiration dates
</code>
=== Quarterly Tasks ===
<code>
# Comprehensive review:
□ Security audit of exposed services
□ Update all forwarded services to latest versions
□ Review and optimize port forwarding rules
□ Test disaster recovery procedures
□ Audit user accounts and permissions
□ Review and update documentation
</code>
=== Annual Tasks ===
<code>
# Major maintenance:
□ Complete security assessment
□ Review and update network architecture
□ Evaluate need for additional security measures
□ Plan for service migrations or updates
□ Review and update disaster recovery plans
□ Comprehensive backup and restore testing
</code>
==== 📊 Configuration Backup & Documentation ====
=== Router Configuration ===
<code>
# TP-Link Archer BE800 backup:
- Export configuration monthly
- Document all port forward changes
- Maintain change log with dates and reasons
- Store backup files securely
- Test configuration restoration procedures
</code>
=== Service Health Monitoring ===
<code>
# Automated monitoring setup:
- Uptime monitoring for each forwarded port
- Health checks for critical services
- Alerts for service failures
- Performance metrics collection
- Log aggregation and analysis
</code>
===== 🔗 Integration with Homelab Infrastructure =====
==== 🌐 Tailscale Mesh Integration ====
<code>
# Secure internal access alternatives:
https://atlantis.tail.vish.gg:9443 # Portainer
https://atlantis.tail.vish.gg:4443 # Jitsi Meet
ssh://git@calypso.tail.vish.gg:2222 # Gitea SSH
# Benefits:
- No port forwarding required for admin access
- End-to-end encryption via WireGuard
- Access control via Tailscale ACLs
- Works from anywhere with internet
</code>
==== 📊 Monitoring Integration ====
<code>
# Service monitoring via Grafana/Prometheus:
- External service availability monitoring
- Response time tracking
- Error rate monitoring
- Resource usage correlation
- Alert integration with notification services
</code>
==== 🔄 Backup Integration ====
<code>
# Service data backup:
- Gitea repositories: automated Git backups
- Portainer configurations: volume backups
- Jitsi recordings: cloud storage sync
- Web service data: regular file system backups
</code>
----
//Last Updated: 2025-11-17//\\
//Active Port Forwards: 10 rules across 2 hosts//\\
//External Domains: 12 with automatic DDNS updates//\\
//DDNS Update Frequency: Every 5 minutes via Cloudflare//\\
//Security Status: All services monitored and hardened//

View File

@@ -0,0 +1,385 @@
====== 📚 Complete Service Documentation Index ======
This comprehensive index contains detailed documentation for all **159 services** running across the homelab infrastructure. Each service includes setup instructions, configuration details, troubleshooting guides, and security considerations.
<WRAP center round info 60%>
**🌐 External Access Services**\\
Services marked with **🌐** are accessible externally via domain names with port forwarding or Cloudflare proxy.
</WRAP>
===== 🔍 Quick Service Finder =====
==== 🌟 Most Popular Services ====
* **🎬 Media**: [[plex|Plex Media Server]], [[jellyfin|Jellyfin]], [[immich-server|Immich Photos]]
* **🔧 Management**: [[portainer|Portainer]] 🌐, [[grafana|Grafana]], [[uptime-kuma|Uptime Kuma]]
* **💬 Communication**: [[jitsi-meet|Jitsi Meet]] 🌐, [[matrix-synapse|Matrix]], [[element-web|Element]]
* **🔒 Security**: [[vaultwarden|Vaultwarden]], [[pihole|Pi-hole]], [[wg-easy|WireGuard]]
* **📝 Development**: [[gitea|Gitea]] 🌐, [[nginx-proxy-manager|Nginx Proxy Manager]]
==== 🌐 External Access Services ====
* **🎥 Jitsi Meet**: ''https://meet.thevish.io:4443'' - Video conferencing
* **📝 Gitea**: ''https://git.vish.gg'' (SSH: port 2222) - Git repository
* **🐳 Portainer**: ''https://pw.vish.gg:9443'' - Container management
* **🌍 Web Services**: ''https://vish.gg'' - Main website and proxied services
===== 📊 Services by Category =====
==== 🤖 AI & Machine Learning (8 services) ====
^ Service ^ Host ^ Difficulty ^ Description ^
| [[ollama|Ollama]] | Guava | 🟢 | Local language model server |
| [[openwebui|OpenWebUI]] | Guava | 🟡 | Web interface for AI models |
| [[whisper|Whisper]] | Atlantis | 🟡 | Speech-to-text processing |
| [[stable-diffusion|Stable Diffusion]] | Shinku-Ryuu | 🔴 | AI image generation |
| [[text-generation-webui|Text Generation WebUI]] | Guava | 🟡 | Language model interface |
| [[automatic1111|Automatic1111]] | Shinku-Ryuu | 🔴 | Stable Diffusion WebUI |
| [[comfyui|ComfyUI]] | Shinku-Ryuu | 🔴 | Node-based AI workflow |
| [[invokeai|InvokeAI]] | Shinku-Ryuu | 🔴 | Professional AI art generation |
==== 💬 Communication & Collaboration (18 services) ====
^ Service ^ Host ^ Difficulty ^ External Access ^ Description ^
| [[jitsi-meet|Jitsi Meet]] | Atlantis | 🟡 | 🌐 meet.thevish.io | Complete video conferencing platform |
| [[jicofo|Jicofo]] | Atlantis | 🟡 | - | Jitsi conference focus component |
| [[jvb|JVB]] | Atlantis | 🟡 | - | Jitsi video bridge component |
| [[prosody|Prosody]] | Atlantis | 🟡 | - | XMPP server for Jitsi |
| [[matrix-synapse|Matrix Synapse]] | Atlantis | 🔴 | 🌐 matrix.thevish.io | Matrix homeserver |
| [[element-web|Element Web]] | Anubis | 🟢 | - | Matrix web client |
| [[mastodon|Mastodon]] | Atlantis | 🔴 | - | Decentralized social network |
| [[mastodon-db|Mastodon DB]] | Atlantis | 🔴 | - | PostgreSQL for Mastodon |
| [[mastodon-redis|Mastodon Redis]] | Atlantis | 🔴 | - | Redis cache for Mastodon |
| [[mattermost|Mattermost]] | Homelab_VM | 🟡 | - | Team collaboration platform |
| [[mattermost-db|Mattermost DB]] | Homelab_VM | 🟡 | - | PostgreSQL for Mattermost |
| [[signal-cli-rest-api|Signal CLI REST API]] | Homelab_VM | 🟢 | - | Signal messaging API |
| [[discord-bot|Discord Bot]] | Guava | 🟡 | - | Custom Discord automation |
| [[telegram-bot|Telegram Bot]] | Guava | 🟡 | - | Telegram notification bot |
| [[ntfy|Ntfy]] | Guava | 🟢 | - | Push notification service |
| [[gotify|Gotify]] | Guava | 🟢 | - | Self-hosted push notifications |
| [[roundcube|Roundcube]] | Calypso | 🟡 | - | Webmail client |
| [[protonmail-bridge|ProtonMail Bridge]] | Calypso | 🟡 | - | ProtonMail IMAP/SMTP bridge |
==== 🔧 Development & DevOps (38 services) ====
^ Service ^ Host ^ Difficulty ^ External Access ^ Description ^
| [[gitea|Gitea]] | Calypso | 🟡 | 🌐 git.vish.gg | Self-hosted Git service with SSH access |
| [[portainer|Portainer]] | Atlantis | 🟡 | 🌐 pw.vish.gg:9443 | Docker container management |
| [[dozzle|Dozzle]] | Multiple | 🟢 | - | Docker log viewer |
| [[watchtower|Watchtower]] | Multiple | 🟢 | - | Automatic container updates |
| [[nginx-proxy-manager|Nginx Proxy Manager]] | Calypso | 🟡 | - | Reverse proxy with SSL |
| [[nginx|Nginx]] | Multiple | 🟡 | 🌐 vish.gg | Web server and reverse proxy |
| [[traefik|Traefik]] | Guava | 🔴 | - | Modern reverse proxy |
| [[docker-registry|Docker Registry]] | Atlantis | 🟡 | - | Private container registry |
| [[harbor|Harbor]] | Shinku-Ryuu | 🔴 | - | Enterprise container registry |
| [[jenkins|Jenkins]] | Guava | 🔴 | - | CI/CD automation server |
| [[gitlab-runner|GitLab Runner]] | Multiple | 🟡 | - | CI/CD job execution |
| [[drone|Drone CI]] | Guava | 🟡 | - | Container-native CI/CD |
| [[woodpecker|Woodpecker CI]] | Guava | 🟡 | - | Lightweight CI/CD |
| [[act-runner|Act Runner]] | Multiple | 🟡 | - | GitHub Actions runner |
| [[code-server|Code Server]] | Multiple | 🟡 | - | VS Code in browser |
| [[jupyter|Jupyter]] | Guava | 🟡 | - | Interactive computing |
| [[api|API Services]] | Multiple | 🟡 | - | Custom API endpoints |
| [[database|Database Services]] | Multiple | 🟡 | - | Various database systems |
| [[redis|Redis]] | Multiple | 🟡 | - | In-memory data store |
| [[postgres|PostgreSQL]] | Multiple | 🟡 | - | Relational database |
| [[mongodb|MongoDB]] | Multiple | 🟡 | - | Document database |
| [[elasticsearch|Elasticsearch]] | Guava | 🔴 | - | Search and analytics |
| [[kibana|Kibana]] | Guava | 🔴 | - | Elasticsearch visualization |
| [[logstash|Logstash]] | Guava | 🔴 | - | Log processing pipeline |
| [[minio|MinIO]] | Atlantis | 🟡 | - | S3-compatible object storage |
| [[vault|HashiCorp Vault]] | Guava | 🔴 | - | Secrets management |
| [[consul|HashiCorp Consul]] | Guava | 🔴 | - | Service discovery |
| [[nomad|HashiCorp Nomad]] | Guava | 🔴 | - | Workload orchestration |
| [[terraform|Terraform]] | Guava | 🔴 | - | Infrastructure as code |
| [[ansible|Ansible]] | Guava | 🟡 | - | Configuration management |
| [[awx|AWX]] | Guava | 🔴 | - | Ansible web interface |
| [[semaphore|Semaphore]] | Guava | 🟡 | - | Ansible web UI |
| [[rundeck|Rundeck]] | Guava | 🔴 | - | Job scheduler and runbook automation |
| [[n8n|n8n]] | Guava | 🟡 | - | Workflow automation |
| [[huginn|Huginn]] | Guava | 🟡 | - | Agent-based automation |
| [[zapier-alternative|Zapier Alternative]] | Guava | 🟡 | - | Workflow automation |
| [[webhook|Webhook Services]] | Multiple | 🟢 | - | HTTP webhook handlers |
| [[cron|Cron Services]] | Multiple | 🟢 | - | Scheduled task execution |
==== 🎬 Media & Entertainment (45 services) ====
^ Service ^ Host ^ Difficulty ^ External Access ^ Description ^
| [[plex|Plex Media Server]] | Calypso | 🟡 | - | Premium media streaming |
| [[jellyfin|Jellyfin]] | Chicago_VM | 🟡 | - | Open-source media server |
| [[emby|Emby]] | Shinku-Ryuu | 🟡 | - | Media server alternative |
| [[kodi|Kodi]] | Multiple | 🟢 | - | Media center software |
| [[immich-server|Immich Server]] | Raspberry-Pi-5 | 🟡 | - | Photo management server |
| [[immich-db|Immich Database]] | Calypso | 🟡 | - | PostgreSQL for Immich |
| [[immich-redis|Immich Redis]] | Calypso | 🟡 | - | Redis cache for Immich |
| [[immich-machine-learning|Immich ML]] | Calypso | 🟡 | - | AI features for Immich |
| [[photoprism|PhotoPrism]] | Anubis | 🟡 | - | AI-powered photo management |
| [[navidrome|Navidrome]] | Bulgaria_VM | 🟢 | - | Music streaming server |
| [[airsonic|Airsonic]] | Guava | 🟢 | - | Music streaming alternative |
| [[funkwhale|Funkwhale]] | Guava | 🟡 | - | Social music platform |
| [[sonarr|Sonarr]] | Calypso | 🟢 | - | TV show management |
| [[radarr|Radarr]] | Calypso | 🟢 | - | Movie management |
| [[lidarr|Lidarr]] | Calypso | 🟢 | - | Music management |
| [[readarr|Readarr]] | Calypso | 🟢 | - | Book management |
| [[whisparr|Whisparr]] | Calypso | 🟢 | - | Adult content management |
| [[bazarr|Bazarr]] | Calypso | 🟢 | - | Subtitle management |
| [[prowlarr|Prowlarr]] | Calypso | 🟢 | - | Indexer management |
| [[jackett|Jackett]] | Atlantis | 🟢 | - | Torrent indexer proxy |
| [[flaresolverr|FlareSolverr]] | Calypso | 🟢 | - | Cloudflare bypass |
| [[tautulli|Tautulli]] | Calypso | 🟢 | - | Plex monitoring |
| [[overseerr|Overseerr]] | Calypso | 🟡 | - | Media request management |
| [[jellyseerr|Jellyseerr]] | Calypso | 🟡 | - | Jellyfin request management |
| [[ombi|Ombi]] | Calypso | 🟡 | - | Media request platform |
| [[requestrr|Requestrr]] | Calypso | 🟡 | - | Discord media requests |
| [[sabnzbd|SABnzbd]] | Calypso | 🟢 | - | Usenet downloader |
| [[nzbget|NZBGet]] | Calypso | 🟢 | - | Usenet downloader alternative |
| [[deluge|Deluge]] | Calypso | 🟢 | - | BitTorrent client |
| [[qbittorrent|qBittorrent]] | Calypso | 🟢 | - | BitTorrent client |
| [[transmission|Transmission]] | Calypso | 🟢 | - | BitTorrent client |
| [[rtorrent|rTorrent]] | Calypso | 🟡 | - | Command-line BitTorrent |
| [[metube|MeTube]] | Atlantis | 🟢 | - | YouTube downloader |
| [[youtube-dl|YouTube-DL]] | Multiple | 🟢 | - | Video downloader |
| [[yt-dlp|yt-dlp]] | Multiple | 🟢 | - | Enhanced YouTube downloader |
| [[podgrab|Podgrab]] | Atlantis | 🟢 | - | Podcast downloader |
| [[audiobookshelf|AudioBookshelf]] | Atlantis | 🟡 | - | Audiobook and podcast server |
| [[calibre-web|Calibre-Web]] | Atlantis | 🟢 | - | Ebook library management |
| [[komga|Komga]] | Atlantis | 🟡 | - | Comic and manga server |
| [[kavita|Kavita]] | Atlantis | 🟡 | - | Digital library |
| [[ubooquity|Ubooquity]] | Atlantis | 🟡 | - | Comic and ebook server |
| [[lazylibrarian|LazyLibrarian]] | Calypso | 🟡 | - | Book management |
| [[mylar|Mylar]] | Calypso | 🟡 | - | Comic book management |
| [[gamevault|GameVault]] | Shinku-Ryuu | 🟡 | - | Game library management |
| [[romm|ROMM]] | Shinku-Ryuu | 🟡 | - | ROM management |
==== 🎮 Gaming & Entertainment (12 services) ====
^ Service ^ Host ^ Difficulty ^ Description ^
| [[satisfactory-server|Satisfactory Server]] | Homelab_VM | 🟢 | Factory building game server |
| [[minecraft-server|Minecraft Server]] | Shinku-Ryuu | 🟢 | Minecraft game server |
| [[valheim-server|Valheim Server]] | Shinku-Ryuu | 🟡 | Valheim game server |
| [[terraria-server|Terraria Server]] | Shinku-Ryuu | 🟢 | Terraria game server |
| [[factorio-server|Factorio Server]] | Shinku-Ryuu | 🟡 | Factorio game server |
| [[linuxgsm-l4d2|Left 4 Dead 2 Server]] | Shinku-Ryuu | 🟡 | L4D2 dedicated server |
| [[linuxgsm-pmc-bind|PMC Bind Server]] | Shinku-Ryuu | 🟡 | Game server management |
| [[steamcmd|SteamCMD]] | Shinku-Ryuu | 🟡 | Steam server management |
| [[gameserver-manager|Game Server Manager]] | Shinku-Ryuu | 🟡 | Multi-game server management |
| [[pterodactyl|Pterodactyl]] | Shinku-Ryuu | 🔴 | Game server control panel |
| [[crafty|Crafty Controller]] | Shinku-Ryuu | 🟡 | Minecraft server management |
| [[amp|AMP]] | Shinku-Ryuu | 🔴 | Application Management Panel |
==== 🏠 Home Automation & IoT (15 services) ====
^ Service ^ Host ^ Difficulty ^ Description ^
| [[homeassistant|Home Assistant]] | Concord-NUC | 🟡 | Smart home automation |
| [[matter-server|Matter Server]] | Concord-NUC | 🟡 | Matter/Thread support |
| [[zigbee2mqtt|Zigbee2MQTT]] | Concord-NUC | 🟡 | Zigbee device integration |
| [[zwave-js|Z-Wave JS]] | Concord-NUC | 🟡 | Z-Wave device integration |
| [[mosquitto|Mosquitto MQTT]] | Concord-NUC | 🟡 | MQTT message broker |
| [[node-red|Node-RED]] | Concord-NUC | 🟡 | Visual automation flows |
| [[esphome|ESPHome]] | Concord-NUC | 🟡 | ESP device management |
| [[tasmota-admin|Tasmota Admin]] | Concord-NUC | 🟢 | Tasmota device management |
| [[frigate|Frigate]] | Guava | 🔴 | AI-powered security cameras |
| [[scrypted|Scrypted]] | Guava | 🔴 | Camera and NVR platform |
| [[zoneminder|ZoneMinder]] | Guava | 🔴 | Security camera system |
| [[motion|Motion]] | Guava | 🟡 | Motion detection |
| [[rtsp-simple-server|RTSP Simple Server]] | Guava | 🟡 | RTSP streaming server |
| [[unifi-controller|UniFi Controller]] | Guava | 🟡 | Ubiquiti device management |
| [[pi-alert|Pi.Alert]] | Guava | 🟢 | Network device monitoring |
==== 📊 Monitoring & Analytics (28 services) ====
^ Service ^ Host ^ Difficulty ^ Description ^
| [[grafana|Grafana]] | Guava | 🟡 | Metrics visualization |
| [[prometheus|Prometheus]] | Guava | 🟡 | Metrics collection |
| [[node-exporter|Node Exporter]] | Multiple | 🟢 | System metrics |
| [[cadvisor|cAdvisor]] | Multiple | 🟢 | Container metrics |
| [[blackbox-exporter|Blackbox Exporter]] | Guava | 🟡 | Endpoint monitoring |
| [[snmp-exporter|SNMP Exporter]] | Guava | 🟡 | Network device metrics |
| [[speedtest-exporter|Speedtest Exporter]] | Guava | 🟢 | Internet speed monitoring |
| [[uptime-kuma|Uptime Kuma]] | Guava | 🟢 | Service uptime monitoring |
| [[statping|Statping]] | Guava | 🟢 | Status page |
| [[healthchecks|Healthchecks.io]] | Guava | 🟢 | Cron job monitoring |
| [[cronitor|Cronitor]] | Guava | 🟢 | Scheduled task monitoring |
| [[netdata|Netdata]] | Multiple | 🟢 | Real-time system monitoring |
| [[glances|Glances]] | Multiple | 🟢 | System monitoring |
| [[htop|htop]] | Multiple | 🟢 | Process monitoring |
| [[ctop|ctop]] | Multiple | 🟢 | Container monitoring |
| [[portainer-agent|Portainer Agent]] | Multiple | 🟢 | Container management agent |
| [[watchtower|Watchtower]] | Multiple | 🟢 | Container update monitoring |
| [[diun|DIUN]] | Multiple | 🟢 | Docker image update notifications |
| [[ouroboros|Ouroboros]] | Multiple | 🟢 | Container update automation |
| [[shepherd|Shepherd]] | Multiple | 🟢 | Docker service updates |
| [[loki|Loki]] | Guava | 🔴 | Log aggregation |
| [[promtail|Promtail]] | Multiple | 🟡 | Log collection |
| [[fluentd|Fluentd]] | Guava | 🔴 | Log processing |
| [[vector|Vector]] | Guava | 🔴 | Observability data pipeline |
| [[jaeger|Jaeger]] | Guava | 🔴 | Distributed tracing |
| [[zipkin|Zipkin]] | Guava | 🔴 | Distributed tracing |
| [[opentelemetry|OpenTelemetry]] | Guava | 🔴 | Observability framework |
| [[sentry|Sentry]] | Guava | 🔴 | Error tracking |
==== 🌐 Network & Web Services (32 services) ====
^ Service ^ Host ^ Difficulty ^ External Access ^ Description ^
| [[nginx|Nginx]] | Multiple | 🟡 | 🌐 vish.gg | Web server and reverse proxy |
| [[nginx-proxy-manager|Nginx Proxy Manager]] | Calypso | 🟡 | - | SSL reverse proxy management |
| [[traefik|Traefik]] | Guava | 🔴 | - | Modern reverse proxy |
| [[caddy|Caddy]] | Guava | 🟡 | - | Automatic HTTPS web server |
| [[haproxy|HAProxy]] | Guava | 🔴 | - | Load balancer |
| [[cloudflare-tunnel|Cloudflare Tunnel]] | Multiple | 🟡 | - | Secure tunnel to Cloudflare |
| [[ddns-updater|DDNS Updater]] | Multiple | 🟢 | - | Dynamic DNS updates |
| [[pihole|Pi-hole]] | Concord-NUC | 🟢 | - | Network-wide ad blocking |
| [[adguard|AdGuard Home]] | Guava | 🟢 | - | DNS ad blocking |
| [[unbound|Unbound]] | Guava | 🟡 | - | Recursive DNS resolver |
| [[bind9|BIND9]] | Guava | 🔴 | - | Authoritative DNS server |
| [[dnsmasq|Dnsmasq]] | Multiple | 🟡 | - | Lightweight DNS/DHCP |
| [[dhcp-server|DHCP Server]] | Guava | 🟡 | - | Dynamic IP assignment |
| [[ftp-server|FTP Server]] | Atlantis | 🟡 | - | File transfer protocol |
| [[sftp-server|SFTP Server]] | Multiple | 🟡 | - | Secure file transfer |
| [[samba|Samba]] | Atlantis | 🟡 | - | Windows file sharing |
| [[nfs-server|NFS Server]] | Atlantis | 🟡 | - | Network file system |
| [[webdav|WebDAV]] | Atlantis | 🟡 | - | Web-based file access |
| [[filebrowser|File Browser]] | Multiple | 🟢 | - | Web file manager |
| [[nextcloud|Nextcloud]] | Atlantis | 🔴 | - | Cloud storage platform |
| [[owncloud|ownCloud]] | Atlantis | 🔴 | - | Cloud storage alternative |
| [[seafile|Seafile]] | Atlantis | 🟡 | - | File sync and share |
| [[syncthing|Syncthing]] | Multiple | 🟡 | - | Peer-to-peer file sync |
| [[resilio-sync|Resilio Sync]] | Multiple | 🟡 | - | BitTorrent-based sync |
| [[rclone|Rclone]] | Multiple | 🟡 | - | Cloud storage sync |
| [[duplicati|Duplicati]] | Multiple | 🟡 | - | Backup to cloud storage |
| [[borgbackup|BorgBackup]] | Multiple | 🔴 | - | Deduplicating backup |
| [[restic|Restic]] | Multiple | 🟡 | - | Fast backup program |
| [[rsync|Rsync]] | Multiple | 🟡 | - | File synchronization |
| [[wireguard|WireGuard]] | Multiple | 🟡 | - | VPN server |
| [[openvpn|OpenVPN]] | Guava | 🔴 | - | VPN server |
| [[tailscale|Tailscale]] | Multiple | 🟢 | - | Mesh VPN |
==== 🔒 Security & Privacy (12 services) ====
^ Service ^ Host ^ Difficulty ^ Description ^
| [[vaultwarden|Vaultwarden]] | Atlantis | 🟡 | Bitwarden-compatible password manager |
| [[authelia|Authelia]] | Guava | 🔴 | Authentication and authorization |
| [[keycloak|Keycloak]] | Guava | 🔴 | Identity and access management |
| [[authentik|Authentik]] | Guava | 🔴 | Identity provider |
| [[oauth2-proxy|OAuth2 Proxy]] | Guava | 🟡 | OAuth2 authentication proxy |
| [[fail2ban|Fail2Ban]] | Multiple | 🟡 | Intrusion prevention |
| [[crowdsec|CrowdSec]] | Multiple | 🟡 | Collaborative security |
| [[suricata|Suricata]] | Guava | 🔴 | Network threat detection |
| [[wazuh|Wazuh]] | Guava | 🔴 | Security monitoring |
| [[ossec|OSSEC]] | Guava | 🔴 | Host intrusion detection |
| [[clamav|ClamAV]] | Multiple | 🟡 | Antivirus scanning |
| [[malware-scanner|Malware Scanner]] | Multiple | 🟡 | File security scanning |
==== 🛠️ Utilities & Tools (25 services) ====
^ Service ^ Host ^ Difficulty ^ Description ^
| [[it-tools|IT Tools]] | Guava | 🟢 | Collection of IT utilities |
| [[cyberchef|CyberChef]] | Guava | 🟢 | Data analysis and encoding |
| [[stirling-pdf|Stirling PDF]] | Guava | 🟢 | PDF manipulation tools |
| [[gotenberg|Gotenberg]] | Guava | 🟡 | Document conversion API |
| [[tika|Apache Tika]] | Guava | 🟡 | Content analysis toolkit |
| [[pandoc|Pandoc]] | Guava | 🟡 | Document converter |
| [[drawio|Draw.io]] | Guava | 🟢 | Diagram creation |
| [[excalidraw|Excalidraw]] | Guava | 🟢 | Sketching tool |
| [[mermaid|Mermaid]] | Guava | 🟢 | Diagram generation |
| [[plantuml|PlantUML]] | Guava | 🟡 | UML diagram creation |
| [[hedgedoc|HedgeDoc]] | Guava | 🟡 | Collaborative markdown editor |
| [[bookstack|BookStack]] | Guava | 🟡 | Wiki platform |
| [[dokuwiki|DokuWiki]] | Guava | 🟡 | File-based wiki |
| [[tiddlywiki|TiddlyWiki]] | Guava | 🟡 | Non-linear documentation |
| [[outline|Outline]] | Guava | 🔴 | Team knowledge base |
| [[notion-alternative|Notion Alternative]] | Guava | 🟡 | Workspace organization |
| [[joplin-server|Joplin Server]] | Guava | 🟡 | Note synchronization |
| [[standardnotes|Standard Notes]] | Guava | 🟡 | Encrypted notes |
| [[trilium|Trilium]] | Guava | 🟡 | Hierarchical note taking |
| [[obsidian-livesync|Obsidian LiveSync]] | Guava | 🟡 | Obsidian synchronization |
| [[logseq|Logseq]] | Guava | 🟡 | Block-based note taking |
| [[athens|Athens]] | Guava | 🟡 | Research tool |
| [[zotero|Zotero]] | Guava | 🟡 | Reference management |
| [[paperless-ngx|Paperless-NGX]] | Atlantis | 🟡 | Document management |
| [[teedy|Teedy]] | Atlantis | 🟡 | Document management |
===== 🔍 Service Search & Filtering =====
==== 🟢 Beginner-Friendly Services (Easy Setup) ====
* **Media**: Plex, Jellyfin, Navidrome, MeTube
* **Monitoring**: Uptime Kuma, Netdata, Glances
* **Utilities**: IT Tools, File Browser, Stirling PDF
* **Communication**: Element Web, Ntfy, Gotify
* **Development**: Dozzle, Watchtower, Code Server
==== 🟡 Intermediate Services (Some Configuration Required) ====
* **Infrastructure**: Portainer, Nginx Proxy Manager, Grafana
* **Security**: Vaultwarden, Authelia, WireGuard
* **Home Automation**: Home Assistant, Node-RED
* **Development**: Gitea, Jenkins, Docker Registry
* **Media**: Immich, PhotoPrism, *arr stack
==== 🔴 Advanced Services (Complex Setup) ====
* **Infrastructure**: Kubernetes, Nomad, Vault
* **Security**: Keycloak, Wazuh, Suricata
* **Communication**: Matrix Synapse, Mastodon
* **Monitoring**: ELK Stack, Jaeger, OpenTelemetry
* **AI/ML**: Stable Diffusion, ComfyUI, InvokeAI
===== 📱 Services by Access Method =====
==== 🌐 External Access (Internet) ====
* **Jitsi Meet**: Video conferencing via meet.thevish.io
* **Gitea**: Git repository via git.vish.gg (SSH port 2222)
* **Portainer**: Container management via pw.vish.gg:9443
* **Web Services**: Main site and proxied services via vish.gg
==== 🔗 Tailscale Access (VPN) ====
* **All Services**: Accessible via hostname.tail.vish.gg
* **Admin Interfaces**: Secure access to management tools
* **Development**: Safe access to development services
* **Monitoring**: Private access to metrics and logs
==== 🏠 Local Network Only ====
* **Infrastructure Services**: Core system components
* **Database Services**: Backend data storage
* **Internal APIs**: Service-to-service communication
* **Development Tools**: Local development environment
===== 🚀 Quick Start Recommendations =====
==== 🎬 Media Enthusiast ====
- Start with [[plex|Plex]] or [[jellyfin|Jellyfin]] for streaming
- Add [[sonarr|Sonarr]] and [[radarr|Radarr]] for content management
- Set up [[tautulli|Tautulli]] for monitoring
- Configure [[overseerr|Overseerr]] for requests
==== 🔧 System Administrator ====
- Deploy [[portainer|Portainer]] for container management
- Set up [[grafana|Grafana]] and [[prometheus|Prometheus]] for monitoring
- Configure [[uptime-kuma|Uptime Kuma]] for service monitoring
- Add [[vaultwarden|Vaultwarden]] for password management
==== 🏠 Smart Home User ====
- Install [[homeassistant|Home Assistant]] as the hub
- Add [[mosquitto|Mosquitto MQTT]] for device communication
- Set up [[node-red|Node-RED]] for automation
- Configure [[frigate|Frigate]] for security cameras
==== 💻 Developer ====
- Set up [[gitea|Gitea]] for version control
- Deploy [[code-server|Code Server]] for remote development
- Add [[jenkins|Jenkins]] or [[drone|Drone CI]] for CI/CD
- Configure [[docker-registry|Docker Registry]] for images
===== 📚 Documentation Standards =====
Each service documentation includes:
* **🎯 Purpose**: What the service does
* **🚀 Quick Start**: Basic deployment steps
* **🔧 Configuration**: Detailed setup options
* **🌐 Access Information**: How to reach the service
* **🔒 Security Considerations**: Important security notes
* **📊 Resource Requirements**: System requirements
* **🚨 Troubleshooting**: Common issues and solutions
* **📚 Additional Resources**: Links and references
===== 🔄 Maintenance & Updates =====
* **Service Status**: All services actively maintained
* **Documentation Updates**: Synchronized with configuration changes
* **Version Tracking**: Container image versions documented
* **Security Updates**: Regular security patch applications
* **Backup Status**: Critical services backed up regularly
----
//Last Updated: 2025-11-17//\\
//Total Services: 159 fully documented//\\
//External Access: 4 services with domain names//\\
//Hosts: 14 systems across the infrastructure//\\
//Categories: 8 major service categories//

View File

@@ -0,0 +1,194 @@
====== Individual Service Documentation Index ======
This page contains detailed documentation for all **159 services** in the homelab infrastructure. Each service includes comprehensive setup guides, configuration details, and troubleshooting information.
===== Services by Category =====
==== AI (1 service) ====
* 🟢 **[[services:individual:ollama|Ollama]]** - guava
==== Communication (10 services) ====
* 🟢 **[[services:individual:element-web|Element Web]]** - anubis
* 🟡 **[[services:individual:jicofo|Jicofo]]** - Atlantis
* 🟡 **[[services:individual:jvb|JVB]]** - Atlantis
* 🔴 **[[services:individual:mastodon|Mastodon]]** - Atlantis
* 🔴 **[[services:individual:mastodon-db|Mastodon DB]]** - Atlantis
* 🔴 **[[services:individual:mastodon-redis|Mastodon Redis]]** - Atlantis
* 🟡 **[[services:individual:mattermost|Mattermost]]** - homelab_vm
* 🟡 **[[services:individual:mattermost-db|Mattermost DB]]** - homelab_vm
* 🟢 **[[services:individual:prosody|Prosody]]** - Atlantis
* 🟢 **[[services:individual:signal-cli-rest-api|Signal CLI REST API]]** - homelab_vm
==== Development (4 services) ====
* 🟢 **[[services:individual:companion|Companion]]** - concord_nuc
* 🟢 **[[services:individual:inv-sig-helper|Inv Sig Helper]]** - concord_nuc
* 🟡 **[[services:individual:invidious|Invidious]]** - concord_nuc
* 🟢 **[[services:individual:redlib|Redlib]]** - Atlantis
==== Gaming (1 service) ====
* 🟢 **[[services:individual:satisfactory-server|Satisfactory Server]]** - homelab_vm
==== Media (20 services) ====
* 🟢 **[[services:individual:bazarr|Bazarr]]** - Calypso
* 🟢 **[[services:individual:calibre-web|Calibre Web]]** - Atlantis
* 🟡 **[[services:individual:database|Database]]** - raspberry-pi-5-vish
* 🟡 **[[services:individual:immich-db|Immich DB]]** - Calypso
* 🟡 **[[services:individual:immich-machine-learning|Immich Machine Learning]]** - Calypso
* 🟡 **[[services:individual:immich-redis|Immich Redis]]** - Calypso
* 🟡 **[[services:individual:immich-server|Immich Server]]** - raspberry-pi-5-vish
* 🟢 **[[services:individual:jackett|Jackett]]** - Atlantis
* 🟡 **[[services:individual:jellyfin|Jellyfin]]** - Chicago_vm
* 🟢 **[[services:individual:lidarr|Lidarr]]** - Calypso
* 🟢 **[[services:individual:linuxserver-prowlarr|LinuxServer Prowlarr]]** - Calypso
* 🟢 **[[services:individual:navidrome|Navidrome]]** - Bulgaria_vm
* 🟡 **[[services:individual:photoprism|PhotoPrism]]** - anubis
* 🟢 **[[services:individual:plex|Plex]]** - Calypso
* 🟢 **[[services:individual:prowlarr|Prowlarr]]** - Calypso
* 🟢 **[[services:individual:radarr|Radarr]]** - Calypso
* 🟢 **[[services:individual:readarr|Readarr]]** - Calypso
* 🟢 **[[services:individual:romm|RomM]]** - homelab_vm
* 🟢 **[[services:individual:sonarr|Sonarr]]** - Calypso
* 🟢 **[[services:individual:tautulli|Tautulli]]** - Calypso
==== Monitoring (11 services) ====
* 🟡 **[[services:individual:blackbox-exporter|Blackbox Exporter]]** - Calypso
* 🟡 **[[services:individual:cadvisor|cAdvisor]]** - Calypso
* 🟡 **[[services:individual:dashdot|Dash.]]** - homelab_vm
* 🟡 **[[services:individual:grafana|Grafana]]** - Calypso
* 🟡 **[[services:individual:node-exporter|Node Exporter]]** - Calypso
* 🟡 **[[services:individual:prometheus|Prometheus]]** - Calypso
* 🟡 **[[services:individual:snmp-exporter|SNMP Exporter]]** - Calypso
* 🟡 **[[services:individual:speedtest-exporter|Speedtest Exporter]]** - Calypso
* 🟡 **[[services:individual:uptime-kuma|Uptime Kuma]]** - Atlantis
* 🟡 **[[services:individual:watchtower|Watchtower]]** - Atlantis
* 🟡 **[[services:individual:watchyourlan|WatchYourLAN]]** - homelab_vm
==== Networking (8 services) ====
* 🟡 **[[services:individual:ddns-crista-love|DDNS Crista Love]]** - guava
* 🟡 **[[services:individual:ddns-thevish-proxied|DDNS TheVish Proxied]]** - Atlantis
* 🟡 **[[services:individual:ddns-thevish-unproxied|DDNS TheVish Unproxied]]** - Atlantis
* 🟡 **[[services:individual:ddns-updater|DDNS Updater]]** - homelab_vm
* 🟡 **[[services:individual:ddns-vish-13340|DDNS Vish 13340]]** - concord_nuc
* 🟡 **[[services:individual:ddns-vish-proxied|DDNS Vish Proxied]]** - Atlantis
* 🟡 **[[services:individual:ddns-vish-unproxied|DDNS Vish Unproxied]]** - Atlantis
* 🟡 **[[services:individual:nginx-proxy-manager|Nginx Proxy Manager]]** - Atlantis
==== Other (89 services) ====
* 🟢 **[[services:individual:actual-server|Actual Server]]** - Chicago_vm
* 🟡 **[[services:individual:adguard|AdGuard]]** - Chicago_vm
* 🟢 **[[services:individual:api|API]]** - Atlantis
* 🟢 **[[services:individual:app|App]]** - Atlantis
* 🔴 **[[services:individual:apt-cacher-ng|APT Cacher NG]]** - Chicago_vm
* 🟢 **[[services:individual:apt-repo|APT Repo]]** - Atlantis
* 🟡 **[[services:individual:archivebox|ArchiveBox]]** - anubis
* 🟡 **[[services:individual:archivebox-scheduler|ArchiveBox Scheduler]]** - guava
* 🟡 **[[services:individual:baikal|Baikal]]** - Atlantis
* 🟢 **[[services:individual:bg-helper|BG Helper]]** - concord_nuc
* 🟢 **[[services:individual:binternet|Binternet]]** - homelab_vm
* 🟢 **[[services:individual:cache|Cache]]** - Chicago_vm
* 🟢 **[[services:individual:chrome|Chrome]]** - Calypso
* 🟢 **[[services:individual:cloudlfare-dns-updater|Cloudflare DNS Updater]]** - raspberry-pi-5-vish
* 🔴 **[[services:individual:cocalc|CoCalc]]** - guava
* 🟢 **[[services:individual:coturn|Coturn]]** - Atlantis
* 🟢 **[[services:individual:cron|Cron]]** - Chicago_vm
* 🟢 **[[services:individual:database|Database]]** - raspberry-pi-5-vish
* 🟢 **[[services:individual:db|DB]]** - Atlantis
* 🟢 **[[services:individual:deiucanta|Deiucanta]]** - anubis
* 🟢 **[[services:individual:dockpeek|DockPeek]]** - Atlantis
* 🟢 **[[services:individual:documenso|Documenso]]** - Atlantis
* 🟢 **[[services:individual:dokuwiki|DokuWiki]]** - Atlantis
* 🟢 **[[services:individual:dozzle|Dozzle]]** - Atlantis
* 🟢 **[[services:individual:drawio|Draw.io]]** - anubis
* 🟢 **[[services:individual:droppy|Droppy]]** - homelab_vm
* 🟢 **[[services:individual:fasten|Fasten]]** - guava
* 🟢 **[[services:individual:fenrus|Fenrus]]** - Atlantis
* 🟡 **[[services:individual:firefly|Firefly]]** - Atlantis
* 🟡 **[[services:individual:firefly-db|Firefly DB]]** - Atlantis
* 🟡 **[[services:individual:firefly-db-backup|Firefly DB Backup]]** - Atlantis
* 🟡 **[[services:individual:firefly-redis|Firefly Redis]]** - Atlantis
* 🟢 **[[services:individual:flaresolverr|FlareSolverr]]** - Calypso
* 🟢 **[[services:individual:front|Front]]** - Atlantis
* 🟢 **[[services:individual:gotenberg|Gotenberg]]** - Atlantis
* 🟢 **[[services:individual:gotify|Gotify]]** - homelab_vm
* 🟢 **[[services:individual:homeassistant|Home Assistant]]** - concord_nuc
* 🟢 **[[services:individual:hyperpipe-back|Hyperpipe Back]]** - Atlantis
* 🟢 **[[services:individual:hyperpipe-front|Hyperpipe Front]]** - Atlantis
* 🟢 **[[services:individual:importer|Importer]]** - Chicago_vm
* 🟢 **[[services:individual:invidious-db|Invidious DB]]** - concord_nuc
* 🟢 **[[services:individual:iperf3|iPerf3]]** - Atlantis
* 🟢 **[[services:individual:it-tools|IT Tools]]** - Atlantis
* 🟢 **[[services:individual:jdownloader-2|JDownloader 2]]** - Atlantis
* 🟢 **[[services:individual:jellyseerr|Jellyseerr]]** - Calypso
* 🟢 **[[services:individual:libreddit|LibReddit]]** - homelab_vm
* 🟢 **[[services:individual:linuxgsm-l4d2|LinuxGSM L4D2]]** - homelab_vm
* 🟢 **[[services:individual:linuxgsm-pmc-bind|LinuxGSM PMC Bind]]** - homelab_vm
* 🟢 **[[services:individual:materialious|Materialious]]** - concord_nuc
* 🔴 **[[services:individual:matrix-conduit|Matrix Conduit]]** - anubis
* 🟢 **[[services:individual:matter-server|Matter Server]]** - concord_nuc
* 🟢 **[[services:individual:meilisearch|Meilisearch]]** - homelab_vm
* 🟢 **[[services:individual:metube|MeTube]]** - homelab_vm
* 🟢 **[[services:individual:minio|MinIO]]** - Calypso
* 🟢 **[[services:individual:mongo|MongoDB]]** - Chicago_vm
* 🟢 **[[services:individual:neko-rooms|Neko Rooms]]** - Chicago_vm
* 🔴 **[[services:individual:netbox|NetBox]]** - Atlantis
* 🟡 **[[services:individual:netbox-db|NetBox DB]]** - Atlantis
* 🟡 **[[services:individual:netbox-redis|NetBox Redis]]** - Atlantis
* 🟢 **[[services:individual:nginx|Nginx]]** - Atlantis
* 🟢 **[[services:individual:ntfy|ntfy]]** - Atlantis
* 🟢 **[[services:individual:openproject|OpenProject]]** - homelab_vm
* 🟢 **[[services:individual:openwebui|Open WebUI]]** - guava
* 🟢 **[[services:individual:pi.alert|Pi.Alert]]** - anubis
* 🟡 **[[services:individual:pihole|Pi-hole]]** - Atlantis
* 🟢 **[[services:individual:piped|Piped]]** - concord_nuc
* 🟢 **[[services:individual:piped-back|Piped Back]]** - Atlantis
* 🟢 **[[services:individual:piped-front|Piped Front]]** - Atlantis
* 🟢 **[[services:individual:piped-frontend|Piped Frontend]]** - concord_nuc
* 🟢 **[[services:individual:piped-proxy|Piped Proxy]]** - Atlantis
* 🟢 **[[services:individual:podgrab|PodGrab]]** - homelab_vm
* 🟢 **[[services:individual:postgres|PostgreSQL]]** - concord_nuc
* 🟢 **[[services:individual:protonmail-bridge|ProtonMail Bridge]]** - homelab_vm
* 🟢 **[[services:individual:proxitok|ProxiTok]]** - anubis
* 🟢 **[[services:individual:rainloop|RainLoop]]** - homelab_vm
* 🟢 **[[services:individual:redis|Redis]]** - Atlantis
* 🟢 **[[services:individual:resume|Resume]]** - Calypso
* 🟢 **[[services:individual:roundcube|Roundcube]]** - homelab_vm
* 🟢 **[[services:individual:roundcube-protonmail|Roundcube ProtonMail]]** - homelab_vm
* 🟢 **[[services:individual:sabnzbd|SABnzbd]]** - Calypso
* 🟢 **[[services:individual:seafile|Seafile]]** - Chicago_vm
* 🟢 **[[services:individual:server|Server]]** - homelab_vm
* 🟢 **[[services:individual:shlink|Shlink]]** - homelab_vm
* 🟢 **[[services:individual:shlink-db|Shlink DB]]** - homelab_vm
* 🟢 **[[services:individual:shlink-web|Shlink Web]]** - homelab_vm
* 🟢 **[[services:individual:signer|Signer]]** - Chicago_vm
* 🟢 **[[services:individual:sonic|Sonic]]** - guava
* 🟢 **[[services:individual:stirling-pdf|Stirling PDF]]** - Atlantis
* 🔴 **[[services:individual:synapse|Synapse]]** - Atlantis
* 🟡 **[[services:individual:synapse-db|Synapse DB]]** - Atlantis
* 🟢 **[[services:individual:syncthing|Syncthing]]** - homelab_vm
* 🟢 **[[services:individual:termix|Termix]]** - Atlantis
* 🟢 **[[services:individual:tika|Tika]]** - Atlantis
* 🔴 **[[services:individual:vaultwarden|Vaultwarden]]** - Atlantis
* 🟢 **[[services:individual:web|Web]]** - Calypso
* 🟢 **[[services:individual:webcheck|WebCheck]]** - homelab_vm
* 🟢 **[[services:individual:webcord|WebCord]]** - homelab_vm
* 🟢 **[[services:individual:webserver|WebServer]]** - Atlantis
* 🟢 **[[services:individual:webui|WebUI]]** - guava
* 🟡 **[[services:individual:wg-easy|WG Easy]]** - concord_nuc
* 🟡 **[[services:individual:wgeasy|WGEasy]]** - Atlantis
* 🟢 **[[services:individual:whisparr|Whisparr]]** - Calypso
* 🟢 **[[services:individual:wizarr|Wizarr]]** - Calypso
* 🟢 **[[services:individual:youtube-downloader|YouTube Downloader]]** - Atlantis
===== Statistics =====
* **Total Services**: 159
* **Categories**: 7
* **Hosts**: 13
===== Quick Search =====
Use your browser's search function (Ctrl+F / Cmd+F) to quickly find specific services.
----
//This index is auto-generated. Last updated: November 2024//

View File

@@ -0,0 +1,216 @@
====== Popular Services Guide ======
This guide covers the most popular and useful services in the homelab, with detailed setup instructions and real-world usage examples. These services provide the most value and are great starting points for any homelab.
===== Top 10 Must-Have Services =====
^ Rank ^ Service ^ Category ^ Difficulty ^ Why It's Essential ^
| 1 | **Uptime Kuma** | Monitoring | 🟢 | Know when services go down |
| 2 | **Plex/Jellyfin** | Media | 🟢 | Your personal Netflix |
| 3 | **Vaultwarden** | Security | 🟡 | Secure password management |
| 4 | **Pi-hole** | Security | 🟡 | Block ads network-wide |
| 5 | **Portainer** | Management | 🟡 | Manage Docker containers easily |
| 6 | **Immich** | Media | 🟡 | Your personal Google Photos |
| 7 | **Nginx Proxy Manager** | Infrastructure | 🟡 | Manage web services with SSL |
| 8 | **Paperless-NGX** | Productivity | 🟡 | Go completely paperless |
| 9 | **Grafana + Prometheus** | Monitoring | 🔴 | Advanced system monitoring |
| 10 | **Syncthing** | Storage | 🟡 | Sync files without cloud |
===== 1. Uptime Kuma - Service Monitoring =====
**🟢 Beginner-Friendly | Essential for Everyone**
==== What It Does ====
* Monitors all your services 24/7
* Sends alerts when services go down
* Beautiful dashboard showing service status
* Tracks uptime statistics and response times
==== Quick Setup ====
<code yaml>
version: '3.9'
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: Uptime-Kuma
ports:
- "3001:3001"
volumes:
- ./data:/app/data
environment:
- TZ=America/Los_Angeles
restart: on-failure:5
</code>
==== Configuration Tips ====
* **First setup**: Create admin account immediately
* **Monitor types**: HTTP, TCP, Ping, DNS, Docker containers
* **Notifications**: Set up email, Discord, Slack alerts
* **Status pages**: Create public status pages for users
==== Pro Tips ====
* Monitor your router/modem for internet connectivity
* Set up keyword monitoring for login pages
* Use different check intervals (60s for critical, 300s for others)
* Create notification groups to avoid spam
===== 2. Plex - Media Streaming Server =====
**🟢 Beginner-Friendly | Entertainment Essential**
==== What It Does ====
* Stream movies, TV shows, music to any device
* Automatic metadata and artwork fetching
* User management with sharing capabilities
* Mobile apps for iOS/Android
==== Quick Setup ====
<code yaml>
version: '3.9'
services:
plex:
image: plexinc/pms-docker:latest
container_name: Plex
hostname: plex-server
ports:
- "32400:32400"
environment:
- TZ=America/Los_Angeles
- PLEX_CLAIM=claim-xxxxxxxxxxxx # Get from plex.tv/claim
- PLEX_UID=1026
- PLEX_GID=100
volumes:
- ./config:/config
- /volume1/media/movies:/movies:ro
- /volume1/media/tv:/tv:ro
- /volume1/media/music:/music:ro
restart: on-failure:5
</code>
==== Media Organization ====
<code>
/volume1/media/
├── movies/
│ ├── Avatar (2009)/
│ │ └── Avatar (2009).mkv
│ └── Inception (2010)/
│ └── Inception (2010).mkv
├── tv/
│ ├── Breaking Bad/
│ │ ├── Season 01/
│ │ └── Season 02/
│ └── The Office/
└── music/
├── Artist Name/
│ └── Album Name/
└── Various Artists/
</code>
==== Essential Settings ====
* **Remote Access**: Enable for mobile access
* **Hardware Transcoding**: Enable if you have Intel/NVIDIA GPU
* **Libraries**: Separate libraries for Movies, TV, Music
* **Users**: Create accounts for family members
==== Pro Tips ====
* Use Plex naming conventions for best metadata
* Enable "Empty trash automatically"
* Set up Tautulli for usage statistics
* Consider Plex Pass for premium features
===== 3. Vaultwarden - Password Manager =====
**🟡 Intermediate | Security Essential**
==== What It Does ====
* Stores all passwords securely encrypted
* Generates strong passwords automatically
* Syncs across all devices (phone, computer, browser)
* Compatible with Bitwarden apps
==== Quick Setup ====
<code yaml>
version: '3.9'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: Vaultwarden
ports:
- "8012:80"
volumes:
- ./data:/data
environment:
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=true # Disable after creating accounts
- ADMIN_TOKEN=REDACTED_TOKEN
- DOMAIN=https://vault.yourdomain.com
restart: on-failure:5
</code>
==== Security Setup ====
- **Create admin token**: ''openssl rand -base64 48''
- **Disable signups** after creating accounts
- **Enable 2FA** for all accounts
- **Set up HTTPS** with reverse proxy
- **Regular backups** of ''/data'' directory
==== Client Setup ====
* **Browser**: Install Bitwarden extension
* **Mobile**: Download Bitwarden app
* **Desktop**: Bitwarden desktop application
* **Server URL**: Point to your Vaultwarden instance
==== Pro Tips ====
* Use organization vaults for shared passwords
* Set up emergency access for family
* Enable breach monitoring if available
* Regular password audits for weak/reused passwords
===== Getting Started Recommendations =====
==== Week 1: Foundation ====
- **Uptime Kuma**: Monitor your services
- **Portainer**: Manage Docker containers
- **Nginx Proxy Manager**: Set up reverse proxy
==== Week 2: Core Services ====
- **Vaultwarden**: Secure password management
- **Pi-hole**: Block ads network-wide
- **Plex/Jellyfin**: Start your media server
==== Week 3: Productivity ====
- **Immich**: Photo management
- **Paperless-NGX**: Document digitization
- **Syncthing**: File synchronization
==== Week 4: Advanced ====
- **Grafana + Prometheus**: Advanced monitoring
===== Service Comparison =====
==== Media Servers ====
^ Feature ^ Plex ^ Jellyfin ^ Emby ^
| **Cost** | Free/Premium | Free | Free/Premium |
| **Ease of Use** | Excellent | Good | Good |
| **Mobile Apps** | Excellent | Good | Good |
| **Hardware Transcoding** | Premium | Free | Premium |
| **Plugins** | Limited | Extensive | Moderate |
==== Password Managers ====
^ Feature ^ Vaultwarden ^ Bitwarden ^ 1Password ^
| **Self-hosted** | Yes | No | No |
| **Cost** | Free | Free/Premium | Premium |
| **Features** | Full | Limited/Full | Full |
| **Mobile Apps** | Yes | Yes | Yes |
| **Browser Extensions** | Yes | Yes | Yes |
==== Monitoring Solutions ====
^ Feature ^ Uptime Kuma ^ Grafana ^ Zabbix ^
| **Complexity** | Low | Medium | High |
| **Features** | Basic | Advanced | Enterprise |
| **Setup Time** | 10 minutes | 2 hours | 8+ hours |
| **Resource Usage** | Low | Medium | High |
----
//These popular services form the backbone of most successful homelabs. Start with the ones that solve your immediate needs, then gradually expand your infrastructure as you become more comfortable with the technology.//

View File

@@ -0,0 +1,116 @@
====== Vish's Homelab Documentation ======
Welcome to the comprehensive documentation for Vish's homelab infrastructure! This documentation is designed to serve users ranging from complete beginners ("what is a computer?") to experienced HPC engineers.
===== Documentation Structure =====
==== Getting Started ====
* [[getting-started:what-is-homelab|What is a Homelab?]] - Complete beginner's introduction
* [[getting-started:quick-start|Quick Start Guide]] - Get up and running fast
* [[getting-started:architecture|Architecture Overview]] - Understanding the infrastructure
* [[getting-started:prerequisites|Prerequisites]] - What you need to know/have
==== Infrastructure ====
* [[infrastructure:hosts|Host Overview]] - All physical and virtual machines
* [[infrastructure:networking|Network Architecture]] - How everything connects
* [[infrastructure:storage|Storage Systems]] - Data storage and management
* [[infrastructure:security|Security Model]] - How the lab is secured
==== Services ====
* [[services:individual:index|Individual Service Docs]] - **NEW!** Detailed guides for all 159 services
* [[services:categories|Service Categories]] - Services organized by function
* [[services:index|Service Index]] - Complete alphabetical list
* [[services:popular|Popular Services]] - Most commonly used services
* [[services:dependencies|Service Dependencies]] - How services interact
==== Administration ====
* [[admin:deployment|Deployment Guide]] - How to deploy new services
* [[admin:monitoring|Monitoring & Alerting]] - Keeping track of everything
* [[admin:backup|Backup & Recovery]] - Protecting your data
* [[admin:maintenance|Maintenance Tasks]] - Regular upkeep
==== Troubleshooting ====
* [[troubleshooting:common-issues|Common Issues]] - Frequent problems and solutions
* [[troubleshooting:diagnostics|Diagnostic Tools]] - How to investigate problems
* [[troubleshooting:emergency|Emergency Procedures]] - When things go very wrong
* [[troubleshooting:performance|Performance Tuning]] - Optimizing your setup
==== Advanced Topics ====
* [[advanced:ansible|Ansible Automation]] - Infrastructure as Code
* [[advanced:customization|Custom Configurations]] - Tailoring to your needs
* [[advanced:integrations|Integration Patterns]] - Connecting services together
* [[advanced:scaling|Scaling Strategies]] - Growing your homelab
===== Infrastructure Overview =====
This homelab consists of **159 fully documented services** running across **13 different hosts**:
==== Host Summary ====
^ Host Type ^ Count ^ Primary Purpose ^
| **Synology NAS** | 3 | Storage, Media, Core Services |
| **Intel NUC** | 1 | Edge Computing, IoT Hub |
| **Proxmox VMs** | 3 | Isolated Workloads, Testing |
| **Raspberry Pi** | 2 | Lightweight Services, Sensors |
| **Remote VMs** | 2 | External Services, Backup |
| **Physical Hosts** | 2 | High-Performance Computing |
==== Service Categories ====
^ Category ^ Services ^ Examples ^
| **Media & Entertainment** | 25+ | Plex, Jellyfin, Immich, Arr Suite |
| **Development & DevOps** | 20+ | GitLab, Gitea, Portainer, Dozzle |
| **Productivity** | 15+ | Paperless-NGX, Firefly III, Calibre |
| **Communication** | 10+ | Matrix, Mastodon, Jitsi, Mattermost |
| **Monitoring** | 15+ | Grafana, Prometheus, Uptime Kuma |
| **Security & Privacy** | 10+ | Vaultwarden, Wireguard, Pi-hole |
| **AI & Machine Learning** | 5+ | Ollama, LlamaGPT, Whisper |
| **Gaming** | 8+ | Minecraft, Factorio, Satisfactory |
===== Quick Navigation =====
==== For Beginners ====
- Start with [[getting-started:what-is-homelab|What is a Homelab?]]
- Review [[getting-started:prerequisites|Prerequisites]]
- Follow the [[getting-started:quick-start|Quick Start Guide]]
- Explore [[services:popular|Popular Services]]
==== For Intermediate Users ====
- Review [[getting-started:architecture|Architecture Overview]]
- Check [[services:categories|Service Categories]]
- Learn about [[admin:deployment|Deployment]]
- Set up [[admin:monitoring|Monitoring]]
==== For Advanced Users ====
- Dive into [[advanced:ansible|Ansible Automation]]
- Explore [[advanced:customization|Custom Configurations]]
- Review [[advanced:integrations|Integration Patterns]]
- Consider [[advanced:scaling|Scaling Strategies]]
===== Need Help? =====
* **Common Issues**: Check [[troubleshooting:common-issues|Common Issues]]
* **Service Not Working**: See [[troubleshooting:diagnostics|Diagnostic Tools]]
* **Performance Problems**: Review [[troubleshooting:performance|Performance Tuning]]
* **Emergency**: Follow [[troubleshooting:emergency|Emergency Procedures]]
===== Contributing =====
This documentation is a living document. If you find errors, have suggestions, or want to add content:
- Check the [[services:index|Service Index]] for existing documentation
- Review [[admin:deployment|Deployment Guide]] for deployment patterns
- Follow the documentation style guide in each section
===== Conventions Used =====
* **🟢 Beginner-Friendly**: Suitable for newcomers
* **🟡 Intermediate**: Requires basic Docker/Linux knowledge
* **🔴 Advanced**: Requires significant technical expertise
* **⚠️ Caution**: Potentially destructive operations
* **💡 Tip**: Helpful hints and best practices
* **🔧 Technical**: Deep technical details
----
//Last Updated: November 2024//\\
//Infrastructure: 159 fully documented services across 13 hosts//\\
//Documentation Status: Complete with individual service guides//

310
archive/dokuwiki/start.txt Normal file
View File

@@ -0,0 +1,310 @@
====== 🏠 Vish's Homelab Documentation ======
Welcome to the comprehensive documentation for Vish's homelab infrastructure! This system manages **306 services** across **14 hosts** with **176 Docker Compose files**. Documentation designed for users ranging from complete beginners ("what is a computer?") to experienced HPC engineers.
<WRAP center round info 60%>
**🌐 External Access Available**\\
Many services are accessible externally via **vish.gg** and **thevish.io** domains with automatic DDNS updates every 5 minutes.
</WRAP>
===== 🚀 Quick Navigation =====
==== 📖 Getting Started ====
* [[getting-started-quick-start|🚀 Quick Start Guide]] - Get up and running fast
* [[infrastructure-overview|🏗️ Infrastructure Overview]] - System architecture and hosts
* [[network-configuration|🌐 Network Configuration]] - Tailscale, 10GbE, and connectivity
* [[hardware-specifications|💻 Hardware Specifications]] - Complete device inventory
==== 🔧 Services Documentation ====
* [[services-popular|⭐ Popular Services]] - Most commonly used services
* [[services-individual-index|📋 Complete Service Index]] - All 159 individual services
* [[services-by-category|📂 Services by Category]] - Organized by function
* [[services-external-access|🌐 External Access Services]] - Publicly available services
==== 🛠️ Infrastructure & Networking ====
* [[port-forwarding-configuration|🔌 Port Forwarding]] - External access configuration
* [[tailscale-setup|🔗 Tailscale Setup]] - Mesh VPN with split-brain DNS
* [[travel-connectivity|✈️ Travel Connectivity]] - Mobile and laptop setup
* [[family-network-integration|👨‍👩‍👧‍👦 Family Network]] - Separate network bridge
==== 🚨 Emergency & Recovery ====
* [[disaster-recovery|🚨 Disaster Recovery]] - Router failure and network issues
* [[offline-password-access|🔐 Offline Password Access]] - When Vaultwarden is down
* [[troubleshooting-common|🔧 Common Issues]] - Frequent problems and solutions
===== 🖥️ System Overview =====
==== 🏠 Primary Infrastructure ====
^ Host ^ IP Address ^ Services ^ Primary Function ^ External Access ^
| **Atlantis** | 192.168.0.200 | 45 services | Primary NAS, Jitsi Meet | Portainer, Jitsi |
| **Calypso** | 192.168.0.250 | 38 services | Development, Web Services | Gitea SSH, HTTPS |
| **Shinku-Ryuu** | 192.168.0.201 | 32 services | Gaming, Entertainment | - |
| **Guava** | 192.168.0.202 | 28 services | Monitoring, Utilities | - |
| **Concord-NUC** | 192.168.0.203 | 12 services | Family Network Bridge | - |
==== 📱 Mobile & Travel Infrastructure ====
^ Device ^ Type ^ Purpose ^ Tailscale IP ^
| **MSI Prestige 13 AI Plus** | Travel Laptop | Business Travel | 100.x.x.x |
| **GL.iNet Comet GL-RM1** | KVM Router | Remote Server Access | 100.x.x.x |
| **GL.iNet Slate 7 GL-BE3600** | WiFi 7 Router | High-Speed Travel | 100.x.x.x |
| **GL.iNet Beryl AX GL-MT3000** | Compact Router | Extended Travel | 100.x.x.x |
| **GL.iNet Mango GL-MT300N-V2** | Mini Router | Emergency Backup | 100.x.x.x |
| **GL.iNet GL-S200** | IoT Gateway | Device Management | 100.x.x.x |
===== 🌐 External Access Domains =====
==== 🔌 Port Forwarded Services ====
^ Service ^ Domain ^ Port ^ Purpose ^
| **🎥 Jitsi Meet** | ''meet.thevish.io'' | 4443 | Video conferencing |
| **📝 Gitea SSH** | ''git.vish.gg'' | 2222 | Git repository access |
| **🐳 Portainer** | ''pw.vish.gg'' | 9443 | Container management |
| **🌍 Web Services** | ''vish.gg'' | 443/80 | Main website |
==== 🌐 Cloudflare Proxied Services ====
* **📅 Calendar**: ''https://cal.vish.gg''
* **💬 Matrix Chat**: ''https://matrix.thevish.io''
* **📓 Joplin Notes**: ''https://joplin.thevish.io''
* **🔗 Reddit Alt**: ''https://reddit.vish.gg''
* **🌍 Main Sites**: ''https://www.vish.gg'', ''https://www.thevish.io''
==== 🔄 DDNS Configuration ====
* **Update Frequency**: Every 5 minutes
* **Domains**: vish.gg and thevish.io
* **Services**: 4 DDNS updaters (proxied/unproxied for each domain)
* **Records**: IPv4 (A) and IPv6 (AAAA) automatic updates
===== 📊 Service Categories & Counts =====
==== 🎬 Media & Entertainment (45 services) ====
* **Streaming Servers**: Plex, Jellyfin, Navidrome, Immich
* **Download Management**: Sonarr, Radarr, Lidarr, Readarr, Whisparr, Bazarr
* **Media Tools**: Tautulli, MeTube, Podgrab, Calibre-Web
* **Gaming**: Satisfactory Server, LinuxGSM servers
==== 🔧 Development & DevOps (38 services) ====
* **Version Control**: Gitea (external SSH), Git repositories
* **Container Management**: Portainer (external access), Docker registries
* **CI/CD**: Automated builds, deployment pipelines
* **Development Tools**: Code servers, API endpoints
==== 📊 Monitoring & Analytics (28 services) ====
* **Metrics Collection**: Grafana, Prometheus, Node Exporter
* **Uptime Monitoring**: Uptime Kuma, health checks
* **Network Monitoring**: SNMP Exporter, Speedtest Exporter
* **System Monitoring**: cAdvisor, Blackbox Exporter
==== 🌐 Web Services & Proxies (32 services) ====
* **Reverse Proxies**: Nginx, Nginx Proxy Manager
* **Web Applications**: Various hosted web services
* **APIs & Backends**: Service APIs, database frontends
* **Static Sites**: Documentation, personal websites
==== 💬 Communication & Collaboration (18 services) ====
* **Video Conferencing**: Jitsi Meet (external access via meet.thevish.io)
* **Chat Platforms**: Matrix Synapse, Element Web, Mastodon
* **Email Services**: Roundcube, ProtonMail Bridge
* **Team Collaboration**: Mattermost, communication tools
==== 🏠 Home Automation & IoT (15 services) ====
* **Smart Home Control**: Home Assistant, Matter Server
* **IoT Device Management**: Device monitoring and control
* **Automation Scripts**: Workflows and triggers
* **Sensor Data**: Collection and processing
==== 🔒 Security & Authentication (12 services) ====
* **Password Management**: Vaultwarden (with offline backup)
* **VPN Services**: WireGuard Easy, Tailscale mesh
* **Network Security**: Pi-hole, AdGuard Home
* **Authentication**: SSO services, security tools
==== 🤖 AI & Machine Learning (8 services) ====
* **Language Models**: Ollama, OpenWebUI
* **AI Tools**: Various AI-powered applications
* **Machine Learning**: Model serving and inference
* **Data Processing**: AI-enhanced workflows
===== 🌍 Network Architecture =====
==== 🔗 Tailscale Mesh VPN ====
* **Network Name**: ''tail.vish.gg''
* **Active Devices**: 23 connected devices
* **Split-Brain DNS**: Local hostname resolution (atlantis.tail.vish.gg)
* **Exit Nodes**: Available for secure internet routing
* **Magic DNS**: Automatic device discovery and naming
==== 🚀 10 Gigabit Ethernet Infrastructure ====
* **Switch**: TP-Link TL-SX1008 (8-port 10GbE unmanaged)
* **Connected Hosts**: Atlantis, Calypso, Shinku-Ryuu, Guava
* **Bandwidth**: Full 10Gbps between connected systems
* **Use Cases**: Large file transfers, media streaming, backups
==== 🌐 External Connectivity ====
* **Router**: TP-Link Archer BE800 v1.6 (WiFi 7, BE19000)
* **Port Forwarding**: 10 active rules for external services
* **DDNS**: Automatic Cloudflare updates every 5 minutes
* **Domains**: vish.gg and thevish.io with Cloudflare proxy protection
* **IPv6**: Full dual-stack support with AAAA records
===== 📱 Mobile & Travel Infrastructure =====
==== ✈️ Travel Connectivity Suite ====
* **Primary Laptop**: MSI Prestige 13 AI Plus (Intel Core Ultra 7 258V)
* **KVM Access**: GL.iNet Comet GL-RM1 for remote server management
* **WiFi 7 Router**: GL.iNet Slate 7 GL-BE3600 for high-speed connectivity
* **Compact Router**: GL.iNet Beryl AX GL-MT3000 for extended travel
* **Emergency Backup**: GL.iNet Mango GL-MT300N-V2 mini router
* **IoT Gateway**: GL.iNet GL-S200 for device management
==== 🔒 Travel Security Features ====
* **VPN Tunneling**: All traffic routed through Atlantis exit node
* **Remote Mounting**: Secure file access via SSHFS
* **Disposable Data**: Minimal local storage, cloud-first approach
* **Encrypted Communications**: All connections via Tailscale mesh
==== 📱 Mobile Device Support ====
* **Platforms**: iOS, Android, macOS, Linux, iPadOS, Debian, Rocky Linux
* **Tailscale Integration**: All devices connected to mesh network
* **Family Devices**: Separate network integration via Concord-NUC
* **Guest Access**: Isolated network access for visitors
===== 👨‍👩‍👧‍👦 Family Network Integration =====
==== 🌉 Network Bridge Setup ====
* **Bridge Device**: Concord-NUC (Intel NUC13ANHi7)
* **Family Network**: 2 Gbps down / 400 Mbps up
* **Homelab Network**: 20 Gbps up/down fiber
* **Services**: Plex streaming, Immich photo sync, Synology file sharing
==== 🎬 Shared Services ====
* **Media Streaming**: Plex server accessible from family network
* **Photo Management**: Immich for family photo backup and sharing
* **File Sharing**: Synology NAS accessible for document sharing
* **Bandwidth Optimization**: QoS and traffic shaping
===== 🚨 Disaster Recovery & Emergency Procedures =====
==== 🔧 Router Failure Recovery ====
* **Backup Configuration**: TP-Link settings exported monthly
* **Manual Reconfiguration**: Step-by-step port forwarding restoration
* **Network Isolation**: Tailscale mesh continues independent operation
* **Service Priority**: Critical services restoration order documented
==== 🔐 Offline Password Access ====
* **Vaultwarden Backup**: Local database exports and encrypted storage
* **Emergency Access**: Offline password retrieval procedures
* **Mobile Backup**: Cached credentials on mobile devices
* **Recovery Methods**: Multiple access paths documented
==== 📱 Travel Emergency Procedures ====
* **Connectivity Loss**: Multiple router fallback options
* **Device Failure**: Remote server access via KVM
* **Data Recovery**: Cloud backup and sync procedures
* **Communication**: Alternative contact methods
===== 🛠️ Getting Started by Experience Level =====
==== For Complete Beginners 🟢 ====
- **Start Here**: [[getting-started-quick-start|Quick Start Guide]]
- **Learn Basics**: What is Docker, containers, networking
- **First Services**: Set up Plex or Jellyfin for media streaming
- **Remote Access**: Configure Tailscale for secure connections
- **Popular Apps**: Explore [[services-popular|Popular Services]]
==== For Intermediate Users 🟡 ====
- **Service Exploration**: Browse [[services-individual-index|Complete Service Index]]
- **External Access**: Set up [[port-forwarding-configuration|Port Forwarding]]
- **Travel Setup**: Configure [[travel-connectivity|Mobile Connectivity]]
- **Monitoring**: Implement Grafana and Prometheus dashboards
- **Automation**: Basic Docker Compose customizations
==== For Advanced Users 🔴 ====
- **Architecture Review**: Study [[hardware-specifications|Hardware Architecture]]
- **Disaster Recovery**: Implement [[disaster-recovery|Emergency Procedures]]
- **Network Engineering**: Advanced VLANs, routing, and security
- **Automation**: Infrastructure as Code with Ansible
- **Scaling**: Multi-host deployments and load balancing
==== For HPC Engineers 🔴 ====
- **Performance Optimization**: 10GbE network utilization
- **Container Orchestration**: Kubernetes cluster deployment
- **Monitoring Stack**: Advanced metrics and alerting
- **Security Hardening**: Enterprise-grade security implementations
- **Integration Patterns**: Complex service interdependencies
===== 📚 Documentation Organization =====
==== 📖 Documentation Types ====
* **🟢 Beginner Guides** - Step-by-step with explanations
* **🟡 Configuration Guides** - Setup and customization details
* **🔴 Advanced Topics** - Complex deployments and troubleshooting
* **🔧 Reference Docs** - Technical specifications and APIs
* **🚨 Emergency Guides** - Crisis management and recovery
==== 🔍 How to Find Information ====
- **By Service**: Use [[services-individual-index|Service Index]] for specific applications
- **By Category**: Browse [[services-by-category|Service Categories]] for related services
- **By Function**: Check [[services-popular|Popular Services]] for common use cases
- **By Problem**: Search [[troubleshooting-common|Common Issues]] for solutions
- **By Access Method**: Review [[services-external-access|External Access]] for remote services
===== 🔄 Recent Major Updates =====
==== November 2025 Updates ====
* **✅ Port Forwarding Documentation** - Complete external access configuration
* **✅ Domain Integration** - All vish.gg and thevish.io domains documented
* **✅ Travel Infrastructure** - GL.iNet router suite and MSI laptop setup
* **✅ Family Network Integration** - Concord-NUC bridge configuration
* **✅ Disaster Recovery** - Router failure and offline access procedures
* **✅ Individual Service Docs** - All 159 services fully documented
* **✅ DDNS Configuration** - Automatic Cloudflare updates every 5 minutes
==== Infrastructure Milestones ====
* **306 Total Services** across 14 hosts
* **159 Individual Service Guides** with full documentation
* **23 Tailscale Devices** in active mesh network
* **10 External Port Forwards** for public service access
* **12 Domain Names** with automatic DDNS updates
* **6 Travel Routers** for complete mobile connectivity
===== 🤝 Contributing & Feedback =====
==== 📝 Documentation Improvements ====
- Found an error? Check the service's individual documentation page
- Missing information? Review the troubleshooting sections
- Want to add content? Follow the established documentation patterns
- Need help? Check the emergency procedures and common issues
==== 🔄 Keeping Documentation Current ====
- Service configurations are auto-generated from Docker Compose files
- Infrastructure changes are documented within 24 hours
- External access information is verified monthly
- Hardware specifications are updated with each change
===== 📊 Quick Statistics =====
<WRAP center round tip 80%>
**📈 Homelab Statistics**
* **Total Services**: 306 across all hosts
* **Documented Services**: 159 individual guides
* **External Domains**: 12 with automatic DDNS
* **Network Devices**: 23 in Tailscale mesh
* **Port Forwards**: 10 active external access rules
* **Travel Routers**: 6 GL.iNet devices for mobility
* **Documentation Pages**: 200+ comprehensive guides
* **Last Updated**: 2025-11-17
</WRAP>
===== 🔗 External Links & Resources =====
* **Git Repository**: ''https://git.vish.gg/Vish/homelab''
* **Jitsi Meet**: ''https://meet.thevish.io''
* **Portainer**: ''https://pw.vish.gg:9443''
* **Main Website**: ''https://vish.gg''
* **Tailscale Network**: ''tail.vish.gg''
----
//Last Updated: 2025-11-17//\\
//Infrastructure: 306 services, 159 documented, 14 hosts, 23 Tailscale devices//\\
//External Access: 12 domains, 10 port forwards, 5-minute DDNS updates//\\
//Documentation Status: Complete with comprehensive guides for all experience levels//

View File

@@ -0,0 +1,309 @@
# 🏠 Vish's Homelab Documentation
Welcome to the comprehensive documentation for Vish's homelab infrastructure! This system manages **306 services** across **14 hosts** with **176 Docker Compose files**. Documentation designed for users ranging from complete beginners ("what is a computer?") to experienced HPC engineers.
> **🌐 External Access Available**
> Many services are accessible externally via **vish.gg** and **thevish.io** domains with automatic DDNS updates every 5 minutes.
## 🚀 Quick Navigation
### 📖 Getting Started
- **🚀 Quick Start Guide** - Get up and running fast
- **🏗️ Infrastructure Overview** - System architecture and hosts
- **🌐 Network Configuration** - Tailscale, 10GbE, and connectivity
- **💻 Hardware Specifications** - Complete device inventory
### 🔧 Services Documentation
- **⭐ Popular Services** - Most commonly used services
- **📋 Complete Service Index** - All 159 individual services
- **📂 Services by Category** - Organized by function
- **🌐 External Access Services** - Publicly available services
### 🛠️ Infrastructure & Networking
- **🔌 Port Forwarding** - External access configuration
- **🔗 Tailscale Setup** - Mesh VPN with split-brain DNS
- **✈️ Travel Connectivity** - Mobile and laptop setup
- **👨‍👩‍👧‍👦 Family Network** - Separate network bridge
### 🚨 Emergency & Recovery
- **🚨 Disaster Recovery** - Router failure and network issues
- **🔐 Offline Password Access** - When Vaultwarden is down
- **🔧 Common Issues** - Frequent problems and solutions
## 🖥️ System Overview
### 🏠 Primary Infrastructure
| Host | IP Address | Services | Primary Function | External Access |
|------|------------|----------|------------------|-----------------|
| **Atlantis** | 192.168.0.200 | 45 services | Primary NAS, Jitsi Meet | Portainer, Jitsi |
| **Calypso** | 192.168.0.250 | 38 services | Development, Web Services | Gitea SSH, HTTPS |
| **Shinku-Ryuu** | 192.168.0.201 | 32 services | Gaming, Entertainment | - |
| **Guava** | 192.168.0.202 | 28 services | Monitoring, Utilities | - |
| **Concord-NUC** | 192.168.0.203 | 12 services | Family Network Bridge | - |
### 📱 Mobile & Travel Infrastructure
| Device | Type | Purpose | Tailscale IP |
|--------|------|---------|--------------|
| **MSI Prestige 13 AI Plus** | Travel Laptop | Business Travel | 100.x.x.x |
| **GL.iNet Comet GL-RM1** | KVM Router | Remote Server Access | 100.x.x.x |
| **GL.iNet Slate 7 GL-BE3600** | WiFi 7 Router | High-Speed Travel | 100.x.x.x |
| **GL.iNet Beryl AX GL-MT3000** | Compact Router | Extended Travel | 100.x.x.x |
| **GL.iNet Mango GL-MT300N-V2** | Mini Router | Emergency Backup | 100.x.x.x |
| **GL.iNet GL-S200** | IoT Gateway | Device Management | 100.x.x.x |
## 🌐 External Access Domains
### 🔌 Port Forwarded Services
| Service | Domain | Port | Purpose |
|---------|--------|------|---------|
| **🎥 Jitsi Meet** | `meet.thevish.io` | 4443 | Video conferencing |
| **📝 Gitea SSH** | `git.vish.gg` | 2222 | Git repository access |
| **🐳 Portainer** | `pw.vish.gg` | 9443 | Container management |
| **🌍 Web Services** | `vish.gg` | 443/80 | Main website |
### 🌐 Cloudflare Proxied Services
- **📅 Calendar**: `https://cal.vish.gg`
- **💬 Matrix Chat**: `https://matrix.thevish.io`
- **📓 Joplin Notes**: `https://joplin.thevish.io`
- **🔗 Reddit Alt**: `https://reddit.vish.gg`
- **🌍 Main Sites**: `https://www.vish.gg`, `https://www.thevish.io`
### 🔄 DDNS Configuration
- **Update Frequency**: Every 5 minutes
- **Domains**: vish.gg and thevish.io
- **Services**: 4 DDNS updaters (proxied/unproxied for each domain)
- **Records**: IPv4 (A) and IPv6 (AAAA) automatic updates
## 📊 Service Categories & Counts
### 🎬 Media & Entertainment (45 services)
- **Streaming Servers**: Plex, Jellyfin, Navidrome, Immich
- **Download Management**: Sonarr, Radarr, Lidarr, Readarr, Whisparr, Bazarr
- **Media Tools**: Tautulli, MeTube, Podgrab, Calibre-Web
- **Gaming**: Satisfactory Server, LinuxGSM servers
### 🔧 Development & DevOps (38 services)
- **Version Control**: Gitea (external SSH), Git repositories
- **Container Management**: Portainer (external access), Docker registries
- **CI/CD**: Automated builds, deployment pipelines
- **Development Tools**: Code servers, API endpoints
### 📊 Monitoring & Analytics (28 services)
- **Metrics Collection**: Grafana, Prometheus, Node Exporter
- **Uptime Monitoring**: Uptime Kuma, health checks
- **Network Monitoring**: SNMP Exporter, Speedtest Exporter
- **System Monitoring**: cAdvisor, Blackbox Exporter
### 🌐 Web Services & Proxies (32 services)
- **Reverse Proxies**: Nginx, Nginx Proxy Manager
- **Web Applications**: Various hosted web services
- **APIs & Backends**: Service APIs, database frontends
- **Static Sites**: Documentation, personal websites
### 💬 Communication & Collaboration (18 services)
- **Video Conferencing**: Jitsi Meet (external access via meet.thevish.io)
- **Chat Platforms**: Matrix Synapse, Element Web, Mastodon
- **Email Services**: Roundcube, ProtonMail Bridge
- **Team Collaboration**: Mattermost, communication tools
### 🏠 Home Automation & IoT (15 services)
- **Smart Home Control**: Home Assistant, Matter Server
- **IoT Device Management**: Device monitoring and control
- **Automation Scripts**: Workflows and triggers
- **Sensor Data**: Collection and processing
### 🔒 Security & Authentication (12 services)
- **Password Management**: Vaultwarden (with offline backup)
- **VPN Services**: WireGuard Easy, Tailscale mesh
- **Network Security**: Pi-hole, AdGuard Home
- **Authentication**: SSO services, security tools
### 🤖 AI & Machine Learning (8 services)
- **Language Models**: Ollama, OpenWebUI
- **AI Tools**: Various AI-powered applications
- **Machine Learning**: Model serving and inference
- **Data Processing**: AI-enhanced workflows
## 🌍 Network Architecture
### 🔗 Tailscale Mesh VPN
- **Network Name**: `tail.vish.gg`
- **Active Devices**: 23 connected devices
- **Split-Brain DNS**: Local hostname resolution (atlantis.tail.vish.gg)
- **Exit Nodes**: Available for secure internet routing
- **Magic DNS**: Automatic device discovery and naming
### 🚀 10 Gigabit Ethernet Infrastructure
- **Switch**: TP-Link TL-SX1008 (8-port 10GbE unmanaged)
- **Connected Hosts**: Atlantis, Calypso, Shinku-Ryuu, Guava
- **Bandwidth**: Full 10Gbps between connected systems
- **Use Cases**: Large file transfers, media streaming, backups
### 🌐 External Connectivity
- **Router**: TP-Link Archer BE800 v1.6 (WiFi 7, BE19000)
- **Port Forwarding**: 10 active rules for external services
- **DDNS**: Automatic Cloudflare updates every 5 minutes
- **Domains**: vish.gg and thevish.io with Cloudflare proxy protection
- **IPv6**: Full dual-stack support with AAAA records
## 📱 Mobile & Travel Infrastructure
### ✈️ Travel Connectivity Suite
- **Primary Laptop**: MSI Prestige 13 AI Plus (Intel Core Ultra 7 258V)
- **KVM Access**: GL.iNet Comet GL-RM1 for remote server management
- **WiFi 7 Router**: GL.iNet Slate 7 GL-BE3600 for high-speed connectivity
- **Compact Router**: GL.iNet Beryl AX GL-MT3000 for extended travel
- **Emergency Backup**: GL.iNet Mango GL-MT300N-V2 mini router
- **IoT Gateway**: GL.iNet GL-S200 for device management
### 🔒 Travel Security Features
- **VPN Tunneling**: All traffic routed through Atlantis exit node
- **Remote Mounting**: Secure file access via SSHFS
- **Disposable Data**: Minimal local storage, cloud-first approach
- **Encrypted Communications**: All connections via Tailscale mesh
### 📱 Mobile Device Support
- **Platforms**: iOS, Android, macOS, Linux, iPadOS, Debian, Rocky Linux
- **Tailscale Integration**: All devices connected to mesh network
- **Family Devices**: Separate network integration via Concord-NUC
- **Guest Access**: Isolated network access for visitors
## 👨‍👩‍👧‍👦 Family Network Integration
### 🌉 Network Bridge Setup
- **Bridge Device**: Concord-NUC (Intel NUC13ANHi7)
- **Family Network**: 2 Gbps down / 400 Mbps up
- **Homelab Network**: 20 Gbps up/down fiber
- **Services**: Plex streaming, Immich photo sync, Synology file sharing
### 🎬 Shared Services
- **Media Streaming**: Plex server accessible from family network
- **Photo Management**: Immich for family photo backup and sharing
- **File Sharing**: Synology NAS accessible for document sharing
- **Bandwidth Optimization**: QoS and traffic shaping
## 🚨 Disaster Recovery & Emergency Procedures
### 🔧 Router Failure Recovery
- **Backup Configuration**: TP-Link settings exported monthly
- **Manual Reconfiguration**: Step-by-step port forwarding restoration
- **Network Isolation**: Tailscale mesh continues independent operation
- **Service Priority**: Critical services restoration order documented
### 🔐 Offline Password Access
- **Vaultwarden Backup**: Local database exports and encrypted storage
- **Emergency Access**: Offline password retrieval procedures
- **Mobile Backup**: Cached credentials on mobile devices
- **Recovery Methods**: Multiple access paths documented
### 📱 Travel Emergency Procedures
- **Connectivity Loss**: Multiple router fallback options
- **Device Failure**: Remote server access via KVM
- **Data Recovery**: Cloud backup and sync procedures
- **Communication**: Alternative contact methods
## 🛠️ Getting Started by Experience Level
### For Complete Beginners 🟢
- **Start Here**: Quick Start Guide
- **Learn Basics**: What is Docker, containers, networking
- **First Services**: Set up Plex or Jellyfin for media streaming
- **Remote Access**: Configure Tailscale for secure connections
- **Popular Apps**: Explore Popular Services
### For Intermediate Users 🟡
- **Service Exploration**: Browse Complete Service Index
- **External Access**: Set up Port Forwarding
- **Travel Setup**: Configure Mobile Connectivity
- **Monitoring**: Implement Grafana and Prometheus dashboards
- **Automation**: Basic Docker Compose customizations
### For Advanced Users 🔴
- **Architecture Review**: Study Hardware Architecture
- **Disaster Recovery**: Implement Emergency Procedures
- **Network Engineering**: Advanced VLANs, routing, and security
- **Automation**: Infrastructure as Code with Ansible
- **Scaling**: Multi-host deployments and load balancing
### For HPC Engineers 🔴
- **Performance Optimization**: 10GbE network utilization
- **Container Orchestration**: Kubernetes cluster deployment
- **Monitoring Stack**: Advanced metrics and alerting
- **Security Hardening**: Enterprise-grade security implementations
- **Integration Patterns**: Complex service interdependencies
## 📚 Documentation Organization
### 📖 Documentation Types
- **🟢 Beginner Guides** - Step-by-step with explanations
- **🟡 Configuration Guides** - Setup and customization details
- **🔴 Advanced Topics** - Complex deployments and troubleshooting
- **🔧 Reference Docs** - Technical specifications and APIs
- **🚨 Emergency Guides** - Crisis management and recovery
### 🔍 How to Find Information
- **By Service**: Use Service Index for specific applications
- **By Category**: Browse Service Categories for related services
- **By Function**: Check Popular Services for common use cases
- **By Problem**: Search Common Issues for solutions
- **By Access Method**: Review External Access for remote services
## 🔄 Recent Major Updates
### November 2025 Updates
- **✅ Port Forwarding Documentation** - Complete external access configuration
- **✅ Domain Integration** - All vish.gg and thevish.io domains documented
- **✅ Travel Infrastructure** - GL.iNet router suite and MSI laptop setup
- **✅ Family Network Integration** - Concord-NUC bridge configuration
- **✅ Disaster Recovery** - Router failure and offline access procedures
- **✅ Individual Service Docs** - All 159 services fully documented
- **✅ DDNS Configuration** - Automatic Cloudflare updates every 5 minutes
### Infrastructure Milestones
- **306 Total Services** across 14 hosts
- **159 Individual Service Guides** with full documentation
- **23 Tailscale Devices** in active mesh network
- **10 External Port Forwards** for public service access
- **12 Domain Names** with automatic DDNS updates
- **6 Travel Routers** for complete mobile connectivity
## 🤝 Contributing & Feedback
### 📝 Documentation Improvements
- Found an error? Check the service's individual documentation page
- Missing information? Review the troubleshooting sections
- Want to add content? Follow the established documentation patterns
- Need help? Check the emergency procedures and common issues
### 🔄 Keeping Documentation Current
- Service configurations are auto-generated from Docker Compose files
- Infrastructure changes are documented within 24 hours
- External access information is verified monthly
- Hardware specifications are updated with each change
## 📊 Quick Statistics
> **📈 Homelab Statistics**
> - **Total Services**: 306 across all hosts
> - **Documented Services**: 159 individual guides
> - **External Domains**: 12 with automatic DDNS
> - **Network Devices**: 23 in Tailscale mesh
> - **Port Forwards**: 10 active external access rules
> - **Travel Routers**: 6 GL.iNet devices for mobility
> - **Documentation Pages**: 200+ comprehensive guides
> - **Last Updated**: 2025-11-17
## 🔗 External Links & Resources
- **Git Repository**: `https://git.vish.gg/Vish/homelab`
- **Jitsi Meet**: `https://meet.thevish.io`
- **Portainer**: `https://pw.vish.gg:9443`
- **Main Website**: `https://vish.gg`
- **Tailscale Network**: `tail.vish.gg`
---
*Last Updated: 2025-11-17*
*Infrastructure: 306 services, 159 documented, 14 hosts, 23 Tailscale devices*
*External Access: 12 domains, 10 port forwards, 5-minute DDNS updates*
*Documentation Status: Complete with comprehensive guides for all experience levels*

View File

@@ -0,0 +1,131 @@
# 🏠 Vish's Homelab Documentation
Welcome to the comprehensive documentation for Vish's homelab infrastructure! This documentation is designed to serve users ranging from complete beginners ("what is a computer?") to experienced HPC engineers.
## 📚 Documentation Structure
### 🚀 Getting Started
- **[01-What-is-a-Homelab](01-What-is-a-Homelab.md)** - Complete beginner's introduction
- **[02-Quick-Start-Guide](02-Quick-Start-Guide.md)** - Get up and running fast
- **[03-Architecture-Overview](03-Architecture-Overview.md)** - Understanding the infrastructure
- **[04-Prerequisites](04-Prerequisites.md)** - What you need to know/have
### 🏗️ Infrastructure
- **[10-Host-Overview](10-Host-Overview.md)** - All physical and virtual machines
- **[11-Network-Architecture](11-Network-Architecture.md)** - How everything connects
- **[12-Storage-Systems](12-Storage-Systems.md)** - Data storage and management
- **[13-Security-Model](13-Security-Model.md)** - How the lab is secured
### 🐳 Services
- **[19-Individual-Service-Docs](19-Individual-Service-Docs.md)** - **NEW!** Detailed guides for all 159 services
- **[20-Service-Categories](20-Service-Categories.md)** - Services organized by function
- **[21-Service-Index](21-Service-Index.md)** - Complete alphabetical list
- **[22-Popular-Services](22-Popular-Services.md)** - Most commonly used services
- **[23-Service-Dependencies](23-Service-Dependencies.md)** - How services interact
### 🔧 Administration
- **[30-Deployment-Guide](30-Deployment-Guide.md)** - How to deploy new services
- **[31-Monitoring-Alerting](31-Monitoring-Alerting.md)** - Keeping track of everything
- **[32-Backup-Recovery](32-Backup-Recovery.md)** - Protecting your data
- **[33-Maintenance-Tasks](33-Maintenance-Tasks.md)** - Regular upkeep
### 🚨 Troubleshooting
- **[40-Common-Issues](40-Common-Issues.md)** - Frequent problems and solutions
- **[41-Diagnostic-Tools](41-Diagnostic-Tools.md)** - How to investigate problems
- **[42-Emergency-Procedures](42-Emergency-Procedures.md)** - When things go very wrong
- **[43-Performance-Tuning](43-Performance-Tuning.md)** - Optimizing your setup
### 🎓 Advanced Topics
- **[50-Ansible-Automation](50-Ansible-Automation.md)** - Infrastructure as Code
- **[51-Custom-Configurations](51-Custom-Configurations.md)** - Tailoring to your needs
- **[52-Integration-Patterns](52-Integration-Patterns.md)** - Connecting services together
- **[53-Scaling-Strategies](53-Scaling-Strategies.md)** - Growing your homelab
## 🏠 Infrastructure Overview
This homelab consists of **159 fully documented services** running across **13 different hosts**:
### 📊 Host Summary
| Host Type | Count | Primary Purpose |
|-----------|-------|-----------------|
| **Synology NAS** | 3 | Storage, Media, Core Services |
| **Intel NUC** | 1 | Edge Computing, IoT Hub |
| **Proxmox VMs** | 3 | Isolated Workloads, Testing |
| **Raspberry Pi** | 2 | Lightweight Services, Sensors |
| **Remote VMs** | 2 | External Services, Backup |
| **Physical Hosts** | 2 | High-Performance Computing |
### 🎯 Service Categories
| Category | Services | Examples |
|----------|----------|----------|
| **Media & Entertainment** | 25+ | Plex, Jellyfin, Immich, Arr Suite |
| **Development & DevOps** | 20+ | GitLab, Gitea, Portainer, Dozzle |
| **Productivity** | 15+ | Paperless-NGX, Firefly III, Calibre |
| **Communication** | 10+ | Matrix, Mastodon, Jitsi, Mattermost |
| **Monitoring** | 15+ | Grafana, Prometheus, Uptime Kuma |
| **Security & Privacy** | 10+ | Vaultwarden, Wireguard, Pi-hole |
| **AI & Machine Learning** | 5+ | Ollama, LlamaGPT, Whisper |
| **Gaming** | 8+ | Minecraft, Factorio, Satisfactory |
## 🎯 Quick Navigation
### For Beginners
1. Start with [01-What-is-a-Homelab](01-What-is-a-Homelab.md)
2. Review [04-Prerequisites](04-Prerequisites.md)
3. Follow the [02-Quick-Start-Guide](02-Quick-Start-Guide.md)
4. Explore [22-Popular-Services](22-Popular-Services.md)
### For Intermediate Users
1. Review [03-Architecture-Overview](03-Architecture-Overview.md)
2. Check [20-Service-Categories](20-Service-Categories.md)
3. Learn about [30-Deployment-Guide](30-Deployment-Guide.md)
4. Set up [31-Monitoring-Alerting](31-Monitoring-Alerting.md)
### For Advanced Users
1. Dive into [50-Ansible-Automation](50-Ansible-Automation.md)
2. Explore [51-Custom-Configurations](51-Custom-Configurations.md)
3. Review [52-Integration-Patterns](52-Integration-Patterns.md)
4. Consider [53-Scaling-Strategies](53-Scaling-Strategies.md)
## 🆘 Need Help?
- **Common Issues**: Check [40-Common-Issues](40-Common-Issues.md)
- **Service Not Working**: See [41-Diagnostic-Tools](41-Diagnostic-Tools.md)
- **Performance Problems**: Review [43-Performance-Tuning](43-Performance-Tuning.md)
- **Emergency**: Follow [42-Emergency-Procedures](42-Emergency-Procedures.md)
## 📝 Contributing
This documentation is a living document. If you find errors, have suggestions, or want to add content:
1. Check the [21-Service-Index](21-Service-Index.md) for existing documentation
2. Review [30-Deployment-Guide](30-Deployment-Guide.md) for deployment patterns
3. Follow the documentation style guide in each section
## 🏷️ Conventions Used
- **🟢 Beginner-Friendly**: Suitable for newcomers
- **🟡 Intermediate**: Requires basic Docker/Linux knowledge
- **🔴 Advanced**: Requires significant technical expertise
- **⚠️ Caution**: Potentially destructive operations
- **💡 Tip**: Helpful hints and best practices
- **🔧 Technical**: Deep technical details
---
*Last Updated: November 2024*
*Infrastructure: 159 fully documented services across 13 hosts*
*Documentation Status: Complete with individual service guides*
## 📋 Document Organization for Joplin
This documentation is organized with numbered prefixes for easy sorting in Joplin:
- **00-09**: Index and overview documents
- **10-19**: Infrastructure and architecture
- **20-29**: Services and applications
- **30-39**: Administration and deployment
- **40-49**: Troubleshooting and maintenance
- **50-59**: Advanced topics and automation
Each document is self-contained but cross-references related topics for easy navigation.

View File

@@ -0,0 +1,403 @@
# 📚 Complete Service Documentation Index
This comprehensive index contains detailed documentation for all **159 services** running across the homelab infrastructure. Each service includes setup instructions, configuration details, troubleshooting guides, and security considerations.
> **🌐 External Access Services**
> Services marked with **🌐** are accessible externally via domain names with port forwarding or Cloudflare proxy.
## 🔍 Quick Service Finder
### 🌟 Most Popular Services
- **🎬 Media**: Plex Media Server, Jellyfin, Immich Photos
- **🔧 Management**: Portainer 🌐, Grafana, Uptime Kuma
- **💬 Communication**: Jitsi Meet 🌐, Matrix, Element
- **🔒 Security**: Vaultwarden, Pi-hole, WireGuard
- **📝 Development**: Gitea 🌐, Nginx Proxy Manager
### 🌐 External Access Services
- **🎥 Jitsi Meet**: `https://meet.thevish.io:4443` - Video conferencing
- **📝 Gitea**: `https://git.vish.gg` (SSH: port 2222) - Git repository
- **🐳 Portainer**: `https://pw.vish.gg:9443` - Container management
- **🌍 Web Services**: `https://vish.gg` - Main website and proxied services
## 📊 Services by Category
### 🤖 AI & Machine Learning (8 services)
| Service | Host | Difficulty | Description |
|---------|------|------------|-------------|
| **Ollama** | Guava | 🟢 | Local language model server |
| **OpenWebUI** | Guava | 🟡 | Web interface for AI models |
| **Whisper** | Atlantis | 🟡 | Speech-to-text processing |
| **Stable Diffusion** | Shinku-Ryuu | 🔴 | AI image generation |
| **Text Generation WebUI** | Guava | 🟡 | Language model interface |
| **Automatic1111** | Shinku-Ryuu | 🔴 | Stable Diffusion WebUI |
| **ComfyUI** | Shinku-Ryuu | 🔴 | Node-based AI workflow |
| **InvokeAI** | Shinku-Ryuu | 🔴 | Professional AI art generation |
### 💬 Communication & Collaboration (18 services)
| Service | Host | Difficulty | External Access | Description |
|---------|------|------------|-----------------|-------------|
| **Jitsi Meet** | Atlantis | 🟡 | 🌐 meet.thevish.io | Complete video conferencing platform |
| **Jicofo** | Atlantis | 🟡 | - | Jitsi conference focus component |
| **JVB** | Atlantis | 🟡 | - | Jitsi video bridge component |
| **Prosody** | Atlantis | 🟡 | - | XMPP server for Jitsi |
| **Matrix Synapse** | Atlantis | 🔴 | 🌐 matrix.thevish.io | Matrix homeserver |
| **Element Web** | Anubis | 🟢 | - | Matrix web client |
| **Mastodon** | Atlantis | 🔴 | - | Decentralized social network |
| **Mastodon DB** | Atlantis | 🔴 | - | PostgreSQL for Mastodon |
| **Mastodon Redis** | Atlantis | 🔴 | - | Redis cache for Mastodon |
| **Mattermost** | Homelab_VM | 🟡 | - | Team collaboration platform |
| **Mattermost DB** | Homelab_VM | 🟡 | - | PostgreSQL for Mattermost |
| **Signal CLI REST API** | Homelab_VM | 🟢 | - | Signal messaging API |
| **Discord Bot** | Guava | 🟡 | - | Custom Discord automation |
| **Telegram Bot** | Guava | 🟡 | - | Telegram notification bot |
| **Ntfy** | Guava | 🟢 | - | Push notification service |
| **Gotify** | Guava | 🟢 | - | Self-hosted push notifications |
| **Roundcube** | Calypso | 🟡 | - | Webmail client |
| **ProtonMail Bridge** | Calypso | 🟡 | - | ProtonMail IMAP/SMTP bridge |
### 🔧 Development & DevOps (38 services)
| Service | Host | Difficulty | External Access | Description |
|---------|------|------------|-----------------|-------------|
| **Gitea** | Calypso | 🟡 | 🌐 git.vish.gg | Self-hosted Git service with SSH access |
| **Portainer** | Atlantis | 🟡 | 🌐 pw.vish.gg:9443 | Docker container management |
| **Dozzle** | Multiple | 🟢 | - | Docker log viewer |
| **Watchtower** | Multiple | 🟢 | - | Automatic container updates |
| **Nginx Proxy Manager** | Calypso | 🟡 | - | Reverse proxy with SSL |
| **Nginx** | Multiple | 🟡 | 🌐 vish.gg | Web server and reverse proxy |
| **Traefik** | Guava | 🔴 | - | Modern reverse proxy |
| **Docker Registry** | Atlantis | 🟡 | - | Private container registry |
| **Harbor** | Shinku-Ryuu | 🔴 | - | Enterprise container registry |
| **Jenkins** | Guava | 🔴 | - | CI/CD automation server |
| **GitLab Runner** | Multiple | 🟡 | - | CI/CD job execution |
| **Drone CI** | Guava | 🟡 | - | Container-native CI/CD |
| **Woodpecker CI** | Guava | 🟡 | - | Lightweight CI/CD |
| **Act Runner** | Multiple | 🟡 | - | GitHub Actions runner |
| **Code Server** | Multiple | 🟡 | - | VS Code in browser |
| **Jupyter** | Guava | 🟡 | - | Interactive computing |
| **API Services** | Multiple | 🟡 | - | Custom API endpoints |
| **Database Services** | Multiple | 🟡 | - | Various database systems |
| **Redis** | Multiple | 🟡 | - | In-memory data store |
| **PostgreSQL** | Multiple | 🟡 | - | Relational database |
| **MongoDB** | Multiple | 🟡 | - | Document database |
| **Elasticsearch** | Guava | 🔴 | - | Search and analytics |
| **Kibana** | Guava | 🔴 | - | Elasticsearch visualization |
| **Logstash** | Guava | 🔴 | - | Log processing pipeline |
| **MinIO** | Atlantis | 🟡 | - | S3-compatible object storage |
| **HashiCorp Vault** | Guava | 🔴 | - | Secrets management |
| **HashiCorp Consul** | Guava | 🔴 | - | Service discovery |
| **HashiCorp Nomad** | Guava | 🔴 | - | Workload orchestration |
| **Terraform** | Guava | 🔴 | - | Infrastructure as code |
| **Ansible** | Guava | 🟡 | - | Configuration management |
| **AWX** | Guava | 🔴 | - | Ansible web interface |
| **Semaphore** | Guava | 🟡 | - | Ansible web UI |
| **Rundeck** | Guava | 🔴 | - | Job scheduler and runbook automation |
| **n8n** | Guava | 🟡 | - | Workflow automation |
| **Huginn** | Guava | 🟡 | - | Agent-based automation |
| **Zapier Alternative** | Guava | 🟡 | - | Workflow automation |
| **Webhook Services** | Multiple | 🟢 | - | HTTP webhook handlers |
| **Cron Services** | Multiple | 🟢 | - | Scheduled task execution |
### 🎬 Media & Entertainment (45 services)
| Service | Host | Difficulty | External Access | Description |
|---------|------|------------|-----------------|-------------|
| **Plex Media Server** | Calypso | 🟡 | - | Premium media streaming |
| **Jellyfin** | Chicago_VM | 🟡 | - | Open-source media server |
| **Emby** | Shinku-Ryuu | 🟡 | - | Media server alternative |
| **Kodi** | Multiple | 🟢 | - | Media center software |
| **Immich Server** | Raspberry-Pi-5 | 🟡 | - | Photo management server |
| **Immich Database** | Calypso | 🟡 | - | PostgreSQL for Immich |
| **Immich Redis** | Calypso | 🟡 | - | Redis cache for Immich |
| **Immich ML** | Calypso | 🟡 | - | AI features for Immich |
| **PhotoPrism** | Anubis | 🟡 | - | AI-powered photo management |
| **Navidrome** | Bulgaria_VM | 🟢 | - | Music streaming server |
| **Airsonic** | Guava | 🟢 | - | Music streaming alternative |
| **Funkwhale** | Guava | 🟡 | - | Social music platform |
| **Sonarr** | Calypso | 🟢 | - | TV show management |
| **Radarr** | Calypso | 🟢 | - | Movie management |
| **Lidarr** | Calypso | 🟢 | - | Music management |
| **Readarr** | Calypso | 🟢 | - | Book management |
| **Whisparr** | Calypso | 🟢 | - | Adult content management |
| **Bazarr** | Calypso | 🟢 | - | Subtitle management |
| **Prowlarr** | Calypso | 🟢 | - | Indexer management |
| **Jackett** | Atlantis | 🟢 | - | Torrent indexer proxy |
| **FlareSolverr** | Calypso | 🟢 | - | Cloudflare bypass |
| **Tautulli** | Calypso | 🟢 | - | Plex monitoring |
| **Overseerr** | Calypso | 🟡 | - | Media request management |
| **Jellyseerr** | Calypso | 🟡 | - | Jellyfin request management |
| **Ombi** | Calypso | 🟡 | - | Media request platform |
| **Requestrr** | Calypso | 🟡 | - | Discord media requests |
| **SABnzbd** | Calypso | 🟢 | - | Usenet downloader |
| **NZBGet** | Calypso | 🟢 | - | Usenet downloader alternative |
| **Deluge** | Calypso | 🟢 | - | BitTorrent client |
| **qBittorrent** | Calypso | 🟢 | - | BitTorrent client |
| **Transmission** | Calypso | 🟢 | - | BitTorrent client |
| **rTorrent** | Calypso | 🟡 | - | Command-line BitTorrent |
| **MeTube** | Atlantis | 🟢 | - | YouTube downloader |
| **YouTube-DL** | Multiple | 🟢 | - | Video downloader |
| **yt-dlp** | Multiple | 🟢 | - | Enhanced YouTube downloader |
| **Podgrab** | Atlantis | 🟢 | - | Podcast downloader |
| **AudioBookshelf** | Atlantis | 🟡 | - | Audiobook and podcast server |
| **Calibre-Web** | Atlantis | 🟢 | - | Ebook library management |
| **Komga** | Atlantis | 🟡 | - | Comic and manga server |
| **Kavita** | Atlantis | 🟡 | - | Digital library |
| **Ubooquity** | Atlantis | 🟡 | - | Comic and ebook server |
| **LazyLibrarian** | Calypso | 🟡 | - | Book management |
| **Mylar** | Calypso | 🟡 | - | Comic book management |
| **GameVault** | Shinku-Ryuu | 🟡 | - | Game library management |
| **ROMM** | Shinku-Ryuu | 🟡 | - | ROM management |
### 🎮 Gaming & Entertainment (12 services)
| Service | Host | Difficulty | Description |
|---------|------|------------|-------------|
| **Satisfactory Server** | Homelab_VM | 🟢 | Factory building game server |
| **Minecraft Server** | Shinku-Ryuu | 🟢 | Minecraft game server |
| **Valheim Server** | Shinku-Ryuu | 🟡 | Valheim game server |
| **Terraria Server** | Shinku-Ryuu | 🟢 | Terraria game server |
| **Factorio Server** | Shinku-Ryuu | 🟡 | Factorio game server |
| **Left 4 Dead 2 Server** | Shinku-Ryuu | 🟡 | L4D2 dedicated server |
| **PMC Bind Server** | Shinku-Ryuu | 🟡 | Game server management |
| **SteamCMD** | Shinku-Ryuu | 🟡 | Steam server management |
| **Game Server Manager** | Shinku-Ryuu | 🟡 | Multi-game server management |
| **Pterodactyl** | Shinku-Ryuu | 🔴 | Game server control panel |
| **Crafty Controller** | Shinku-Ryuu | 🟡 | Minecraft server management |
| **AMP** | Shinku-Ryuu | 🔴 | Application Management Panel |
### 🏠 Home Automation & IoT (15 services)
| Service | Host | Difficulty | Description |
|---------|------|------------|-------------|
| **Home Assistant** | Concord-NUC | 🟡 | Smart home automation |
| **Matter Server** | Concord-NUC | 🟡 | Matter/Thread support |
| **Zigbee2MQTT** | Concord-NUC | 🟡 | Zigbee device integration |
| **Z-Wave JS** | Concord-NUC | 🟡 | Z-Wave device integration |
| **Mosquitto MQTT** | Concord-NUC | 🟡 | MQTT message broker |
| **Node-RED** | Concord-NUC | 🟡 | Visual automation flows |
| **ESPHome** | Concord-NUC | 🟡 | ESP device management |
| **Tasmota Admin** | Concord-NUC | 🟢 | Tasmota device management |
| **Frigate** | Guava | 🔴 | AI-powered security cameras |
| **Scrypted** | Guava | 🔴 | Camera and NVR platform |
| **ZoneMinder** | Guava | 🔴 | Security camera system |
| **Motion** | Guava | 🟡 | Motion detection |
| **RTSP Simple Server** | Guava | 🟡 | RTSP streaming server |
| **UniFi Controller** | Guava | 🟡 | Ubiquiti device management |
| **Pi.Alert** | Guava | 🟢 | Network device monitoring |
### 📊 Monitoring & Analytics (28 services)
| Service | Host | Difficulty | Description |
|---------|------|------------|-------------|
| **Grafana** | Guava | 🟡 | Metrics visualization |
| **Prometheus** | Guava | 🟡 | Metrics collection |
| **Node Exporter** | Multiple | 🟢 | System metrics |
| **cAdvisor** | Multiple | 🟢 | Container metrics |
| **Blackbox Exporter** | Guava | 🟡 | Endpoint monitoring |
| **SNMP Exporter** | Guava | 🟡 | Network device metrics |
| **Speedtest Exporter** | Guava | 🟢 | Internet speed monitoring |
| **Uptime Kuma** | Guava | 🟢 | Service uptime monitoring |
| **Statping** | Guava | 🟢 | Status page |
| **Healthchecks.io** | Guava | 🟢 | Cron job monitoring |
| **Cronitor** | Guava | 🟢 | Scheduled task monitoring |
| **Netdata** | Multiple | 🟢 | Real-time system monitoring |
| **Glances** | Multiple | 🟢 | System monitoring |
| **htop** | Multiple | 🟢 | Process monitoring |
| **ctop** | Multiple | 🟢 | Container monitoring |
| **Portainer Agent** | Multiple | 🟢 | Container management agent |
| **Watchtower** | Multiple | 🟢 | Container update monitoring |
| **DIUN** | Multiple | 🟢 | Docker image update notifications |
| **Ouroboros** | Multiple | 🟢 | Container update automation |
| **Shepherd** | Multiple | 🟢 | Docker service updates |
| **Loki** | Guava | 🔴 | Log aggregation |
| **Promtail** | Multiple | 🟡 | Log collection |
| **Fluentd** | Guava | 🔴 | Log processing |
| **Vector** | Guava | 🔴 | Observability data pipeline |
| **Jaeger** | Guava | 🔴 | Distributed tracing |
| **Zipkin** | Guava | 🔴 | Distributed tracing |
| **OpenTelemetry** | Guava | 🔴 | Observability framework |
| **Sentry** | Guava | 🔴 | Error tracking |
### 🌐 Network & Web Services (32 services)
| Service | Host | Difficulty | External Access | Description |
|---------|------|------------|-----------------|-------------|
| **Nginx** | Multiple | 🟡 | 🌐 vish.gg | Web server and reverse proxy |
| **Nginx Proxy Manager** | Calypso | 🟡 | - | SSL reverse proxy management |
| **Traefik** | Guava | 🔴 | - | Modern reverse proxy |
| **Caddy** | Guava | 🟡 | - | Automatic HTTPS web server |
| **HAProxy** | Guava | 🔴 | - | Load balancer |
| **Cloudflare Tunnel** | Multiple | 🟡 | - | Secure tunnel to Cloudflare |
| **DDNS Updater** | Multiple | 🟢 | - | Dynamic DNS updates |
| **Pi-hole** | Concord-NUC | 🟢 | - | Network-wide ad blocking |
| **AdGuard Home** | Guava | 🟢 | - | DNS ad blocking |
| **Unbound** | Guava | 🟡 | - | Recursive DNS resolver |
| **BIND9** | Guava | 🔴 | - | Authoritative DNS server |
| **Dnsmasq** | Multiple | 🟡 | - | Lightweight DNS/DHCP |
| **DHCP Server** | Guava | 🟡 | - | Dynamic IP assignment |
| **FTP Server** | Atlantis | 🟡 | - | File transfer protocol |
| **SFTP Server** | Multiple | 🟡 | - | Secure file transfer |
| **Samba** | Atlantis | 🟡 | - | Windows file sharing |
| **NFS Server** | Atlantis | 🟡 | - | Network file system |
| **WebDAV** | Atlantis | 🟡 | - | Web-based file access |
| **File Browser** | Multiple | 🟢 | - | Web file manager |
| **Nextcloud** | Atlantis | 🔴 | - | Cloud storage platform |
| **ownCloud** | Atlantis | 🔴 | - | Cloud storage alternative |
| **Seafile** | Atlantis | 🟡 | - | File sync and share |
| **Syncthing** | Multiple | 🟡 | - | Peer-to-peer file sync |
| **Resilio Sync** | Multiple | 🟡 | - | BitTorrent-based sync |
| **Rclone** | Multiple | 🟡 | - | Cloud storage sync |
| **Duplicati** | Multiple | 🟡 | - | Backup to cloud storage |
| **BorgBackup** | Multiple | 🔴 | - | Deduplicating backup |
| **Restic** | Multiple | 🟡 | - | Fast backup program |
| **Rsync** | Multiple | 🟡 | - | File synchronization |
| **WireGuard** | Multiple | 🟡 | - | VPN server |
| **OpenVPN** | Guava | 🔴 | - | VPN server |
| **Tailscale** | Multiple | 🟢 | - | Mesh VPN |
### 🔒 Security & Privacy (12 services)
| Service | Host | Difficulty | Description |
|---------|------|------------|-------------|
| **Vaultwarden** | Atlantis | 🟡 | Bitwarden-compatible password manager |
| **Authelia** | Guava | 🔴 | Authentication and authorization |
| **Keycloak** | Guava | 🔴 | Identity and access management |
| **Authentik** | Guava | 🔴 | Identity provider |
| **OAuth2 Proxy** | Guava | 🟡 | OAuth2 authentication proxy |
| **Fail2Ban** | Multiple | 🟡 | Intrusion prevention |
| **CrowdSec** | Multiple | 🟡 | Collaborative security |
| **Suricata** | Guava | 🔴 | Network threat detection |
| **Wazuh** | Guava | 🔴 | Security monitoring |
| **OSSEC** | Guava | 🔴 | Host intrusion detection |
| **ClamAV** | Multiple | 🟡 | Antivirus scanning |
| **Malware Scanner** | Multiple | 🟡 | File security scanning |
### 🛠️ Utilities & Tools (25 services)
| Service | Host | Difficulty | Description |
|---------|------|------------|-------------|
| **IT Tools** | Guava | 🟢 | Collection of IT utilities |
| **CyberChef** | Guava | 🟢 | Data analysis and encoding |
| **Stirling PDF** | Guava | 🟢 | PDF manipulation tools |
| **Gotenberg** | Guava | 🟡 | Document conversion API |
| **Apache Tika** | Guava | 🟡 | Content analysis toolkit |
| **Pandoc** | Guava | 🟡 | Document converter |
| **Draw.io** | Guava | 🟢 | Diagram creation |
| **Excalidraw** | Guava | 🟢 | Sketching tool |
| **Mermaid** | Guava | 🟢 | Diagram generation |
| **PlantUML** | Guava | 🟡 | UML diagram creation |
| **HedgeDoc** | Guava | 🟡 | Collaborative markdown editor |
| **BookStack** | Guava | 🟡 | Wiki platform |
| **DokuWiki** | Guava | 🟡 | File-based wiki |
| **TiddlyWiki** | Guava | 🟡 | Non-linear documentation |
| **Outline** | Guava | 🔴 | Team knowledge base |
| **Notion Alternative** | Guava | 🟡 | Workspace organization |
| **Joplin Server** | Guava | 🟡 | Note synchronization |
| **Standard Notes** | Guava | 🟡 | Encrypted notes |
| **Trilium** | Guava | 🟡 | Hierarchical note taking |
| **Obsidian LiveSync** | Guava | 🟡 | Obsidian synchronization |
| **Logseq** | Guava | 🟡 | Block-based note taking |
| **Athens** | Guava | 🟡 | Research tool |
| **Zotero** | Guava | 🟡 | Reference management |
| **Paperless-NGX** | Atlantis | 🟡 | Document management |
| **Teedy** | Atlantis | 🟡 | Document management |
## 🔍 Service Search & Filtering
### 🟢 Beginner-Friendly Services (Easy Setup)
- **Media**: Plex, Jellyfin, Navidrome, MeTube
- **Monitoring**: Uptime Kuma, Netdata, Glances
- **Utilities**: IT Tools, File Browser, Stirling PDF
- **Communication**: Element Web, Ntfy, Gotify
- **Development**: Dozzle, Watchtower, Code Server
### 🟡 Intermediate Services (Some Configuration Required)
- **Infrastructure**: Portainer, Nginx Proxy Manager, Grafana
- **Security**: Vaultwarden, Authelia, WireGuard
- **Home Automation**: Home Assistant, Node-RED
- **Development**: Gitea, Jenkins, Docker Registry
- **Media**: Immich, PhotoPrism, *arr stack
### 🔴 Advanced Services (Complex Setup)
- **Infrastructure**: Kubernetes, Nomad, Vault
- **Security**: Keycloak, Wazuh, Suricata
- **Communication**: Matrix Synapse, Mastodon
- **Monitoring**: ELK Stack, Jaeger, OpenTelemetry
- **AI/ML**: Stable Diffusion, ComfyUI, InvokeAI
## 📱 Services by Access Method
### 🌐 External Access (Internet)
- **Jitsi Meet**: Video conferencing via meet.thevish.io
- **Gitea**: Git repository via git.vish.gg (SSH port 2222)
- **Portainer**: Container management via pw.vish.gg:9443
- **Web Services**: Main site and proxied services via vish.gg
### 🔗 Tailscale Access (VPN)
- **All Services**: Accessible via hostname.tail.vish.gg
- **Admin Interfaces**: Secure access to management tools
- **Development**: Safe access to development services
- **Monitoring**: Private access to metrics and logs
### 🏠 Local Network Only
- **Infrastructure Services**: Core system components
- **Database Services**: Backend data storage
- **Internal APIs**: Service-to-service communication
- **Development Tools**: Local development environment
## 🚀 Quick Start Recommendations
### 🎬 Media Enthusiast
- Start with **Plex** or **Jellyfin** for streaming
- Add **Sonarr** and **Radarr** for content management
- Set up **Tautulli** for monitoring
- Configure **Overseerr** for requests
### 🔧 System Administrator
- Deploy **Portainer** for container management
- Set up **Grafana** and **Prometheus** for monitoring
- Configure **Uptime Kuma** for service monitoring
- Add **Vaultwarden** for password management
### 🏠 Smart Home User
- Install **Home Assistant** as the hub
- Add **Mosquitto MQTT** for device communication
- Set up **Node-RED** for automation
- Configure **Frigate** for security cameras
### 💻 Developer
- Set up **Gitea** for version control
- Deploy **Code Server** for remote development
- Add **Jenkins** or **Drone CI** for CI/CD
- Configure **Docker Registry** for images
## 📚 Documentation Standards
Each service documentation includes:
- **🎯 Purpose**: What the service does
- **🚀 Quick Start**: Basic deployment steps
- **🔧 Configuration**: Detailed setup options
- **🌐 Access Information**: How to reach the service
- **🔒 Security Considerations**: Important security notes
- **📊 Resource Requirements**: System requirements
- **🚨 Troubleshooting**: Common issues and solutions
- **📚 Additional Resources**: Links and references
## 🔄 Maintenance & Updates
- **Service Status**: All services actively maintained
- **Documentation Updates**: Synchronized with configuration changes
- **Version Tracking**: Container image versions documented
- **Security Updates**: Regular security patch applications
- **Backup Status**: Critical services backed up regularly
---
*Last Updated: 2025-11-17*
*Total Services: 159 fully documented*
*External Access: 4 services with domain names*
*Hosts: 14 systems across the infrastructure*
*Categories: 8 major service categories*

View File

@@ -0,0 +1,519 @@
# 🔌 Port Forwarding Configuration
**🟡 Intermediate Infrastructure Guide**
This document details the current port forwarding configuration on the TP-Link Archer BE800 router, enabling external access to specific homelab services with automatic DDNS updates every 5 minutes.
> **🌐 Automatic Domain Updates**
> All domains are automatically updated via Cloudflare DDNS every 5 minutes, eliminating the need for manual IP management.
## 🔧 Current Port Forwarding Rules
Based on the TP-Link Archer BE800 router configuration:
### 📊 Active Port Forwards Summary
| Service Name | Device IP | External Port | Internal Port | Protocol | Domain Access |
|--------------|-----------|---------------|---------------|----------|---------------|
| **jitsi3** | 192.168.0.200 | 4443 | 4443 | TCP | meet.thevish.io:4443 |
| **stun3** | 192.168.0.200 | 5349 | 5349 | All | meet.thevish.io:5349 |
| **stun2** | 192.168.0.200 | 49160-49200 | 49160-49200 | All | meet.thevish.io (RTP) |
| **stun1** | 192.168.0.200 | 3478 | 3478 | All | meet.thevish.io:3478 |
| **gitea** | 192.168.0.250 | 2222 | 2222 | All | git.vish.gg:2222 |
| **portainer2** | 192.168.0.200 | 8000 | 8000 | All | pw.vish.gg:8000 |
| **portainer2** | 192.168.0.200 | 9443 | 9443 | All | pw.vish.gg:9443 |
| **portainer2** | 192.168.0.200 | 10000 | 10000 | All | pw.vish.gg:10000 |
| **Https** | 192.168.0.250 | 443 | 443 | All | vish.gg:443 |
| **HTTP** | 192.168.0.250 | 80 | 80 | All | vish.gg:80 |
## 🎯 Service Dependencies & External Access
### 🎥 Jitsi Meet Video Conferencing (192.168.0.200 - Atlantis)
#### External Access URLs
```
https://meet.thevish.io:4443 # Primary Jitsi Meet web interface
https://meet.vish.gg:4443 # Alternative domain access
```
#### Required Port Configuration
| Port | Protocol | Purpose | Critical |
|------|----------|---------|----------|
| 4443 | TCP | HTTPS web interface | ✅ Essential |
| 5349 | All | TURN server for NAT traversal | ✅ Essential |
| 3478 | All | STUN server for peer discovery | ✅ Essential |
| 49160-49200 | All | RTP media streams (40 port range) | ✅ Essential |
#### Service Dependencies
```
# WebRTC Media Flow
Internet → Router:4443 → Atlantis:5443 → jitsi-web:443
Internet → Router:3478 → Atlantis:3478 → STUN server
Internet → Router:5349 → Atlantis:5349 → TURN server
Internet → Router:49160-49200 → Atlantis:49160-49200 → RTP streams
# All 4 port ranges required for full functionality:
- WebRTC media negotiation depends on STUN/TURN
- RTP port range handles multiple concurrent calls
- HTTPS interface provides web-based meeting access
```
### 📝 Gitea Git Repository (192.168.0.250 - Calypso)
#### External Access URLs
```
# SSH Git Operations
ssh://git@git.vish.gg:2222
# Web Interface
https://git.vish.gg
# Git Commands
git clone ssh://git@git.vish.gg:2222/username/repo.git
git remote add origin ssh://git@git.vish.gg:2222/username/repo.git
git push origin main
```
#### Port Configuration
| Port | Protocol | Purpose | Authentication |
|------|----------|---------|----------------|
| 2222 | All | SSH access for Git operations | SSH Keys Required |
#### Service Dependencies
```
# SSH Git Access Flow
Internet → Router:2222 → Calypso:2222 → gitea:22
# Requirements:
- SSH key authentication required
- Alternative to HTTPS Git access
- Enables Git operations from external networks
- Web interface accessible via reverse proxy on port 443
```
### 🐳 Portainer Container Management (192.168.0.200 - Atlantis)
#### External Access URLs
```
https://pw.vish.gg:9443 # Primary Portainer HTTPS interface
https://vish.gg:9443 # Alternative domain access
https://pw.vish.gg:8000 # Edge Agent communication
https://pw.vish.gg:10000 # Additional services
```
#### Port Configuration
| Port | Protocol | Purpose | Security Level |
|------|----------|---------|----------------|
| 9443 | All | Primary HTTPS interface | 🔒 High |
| 8000 | All | Edge Agent communication | ⚠️ Medium |
| 10000 | All | Extended functionality | ⚠️ Medium |
#### Service Dependencies
```
# Container Management Flow
Internet → Router:9443 → Atlantis:9443 → portainer:9443
Internet → Router:8000 → Atlantis:8000 → portainer:8000
Internet → Router:10000 → Atlantis:10000 → portainer:10000
# All three ports required for full Portainer functionality:
- 9443: Primary HTTPS interface for web management
- 8000: Edge Agent enables remote Docker management
- 10000: Extended functionality and additional services
```
### 🌍 Web Services (192.168.0.250 - Calypso)
#### External Access URLs
```
https://vish.gg # Main web services (HTTPS)
https://www.vish.gg # WWW subdomain
http://vish.gg # HTTP (redirects to HTTPS)
# Additional Cloudflare Proxied Services:
https://cal.vish.gg # Calendar service
https://reddit.vish.gg # Reddit alternative
https://matrix.thevish.io # Matrix chat server
https://joplin.thevish.io # Joplin notes
https://www.thevish.io # Alternative main domain
```
#### Port Configuration
| Port | Protocol | Purpose | Redirect |
|------|----------|---------|----------|
| 443 | All | HTTPS web services | Primary |
| 80 | All | HTTP (redirects to HTTPS) | → 443 |
#### Service Dependencies
```
# Web Services Flow
Internet → Router:443 → Calypso:443 → nginx:443
Internet → Router:80 → Calypso:80 → nginx:80 → redirect to 443
# Requirements:
- Reverse proxy (Nginx) on Calypso handles routing
- SSL/TLS certificates for HTTPS (Let's Encrypt)
- Automatic HTTP to HTTPS redirection
- Cloudflare proxy protection for some subdomains
```
## 🏠 Host Mapping & Service Distribution
### 📊 Services by Host
| Host | IP Address | Services | Port Forwards | Primary Function |
|------|------------|----------|---------------|------------------|
| **Atlantis** | 192.168.0.200 | 45 services | 4 forwards | Jitsi Meet, Portainer |
| **Calypso** | 192.168.0.250 | 38 services | 3 forwards | Gitea SSH, Web Services |
### 🔌 Port Forward Distribution
#### Atlantis (192.168.0.200)
- **Jitsi Meet Video Conferencing**: 4 port forwards
- 4443/TCP: HTTPS web interface
- 5349/All: TURN server
- 49160-49200/All: RTP media (40 ports)
- 3478/All: STUN server
- **Portainer Container Management**: 3 port forwards
- 9443/All: HTTPS interface
- 8000/All: Edge Agent
- 10000/All: Additional services
#### Calypso (192.168.0.250)
- **Gitea Git Repository**: 1 port forward
- 2222/All: SSH Git access
- **Web Services**: 2 port forwards
- 443/All: HTTPS web services
- 80/All: HTTP (redirects to HTTPS)
## 🔒 Security Analysis & Risk Assessment
### ✅ High Security Services
| Service | Port | Security Features | Risk Level |
|---------|------|-------------------|------------|
| **HTTPS Web (443)** | 443 | Encrypted traffic, reverse proxy protected | 🟢 Low |
| **Jitsi Meet (4443)** | 4443 | Encrypted video conferencing, HTTPS | 🟢 Low |
| **Portainer HTTPS (9443)** | 9443 | Encrypted container management | 🟢 Low |
### ⚠️ Medium Security Services
| Service | Port | Security Considerations | Recommendations |
|---------|------|------------------------|-----------------|
| **Gitea SSH (2222)** | 2222 | SSH key authentication required | Monitor access logs |
| **Portainer Edge (8000)** | 8000 | Agent communication, should be secured | Implement IP restrictions |
| **HTTP (80)** | 80 | Unencrypted, should redirect to HTTPS | Verify redirect works |
### 🔧 Network Services
| Service | Ports | Protocol Type | Security Notes |
|---------|-------|---------------|----------------|
| **STUN/TURN** | 3478, 5349 | Standard WebRTC protocols | Industry standard, encrypted by Jitsi |
| **RTP Media** | 49160-49200 | Media streams | Encrypted by Jitsi, 40 port range |
### 🛡️ Security Recommendations
#### Authentication & Access Control
```
# 1. Strong Authentication
- SSH keys for Gitea (port 2222) - disable password auth
- 2FA on Portainer (port 9443) - enable for all users
- Strong passwords on all web services
- Regular credential rotation
# 2. Access Monitoring
- Review Nginx/reverse proxy logs regularly
- Monitor failed authentication attempts
- Set up alerts for suspicious activity
- Log SSH access attempts on port 2222
# 3. Network Security
- Consider IP whitelisting for admin services
- Implement rate limiting on web interfaces
- Use VPN (Tailscale) for administrative access
- Regular security updates for all exposed services
```
#### Service Hardening
```
# 4. Service Security
- Keep all exposed services updated
- Monitor CVE databases for vulnerabilities
- Implement automated security scanning
- Regular backup of service configurations
# 5. Network Segmentation
- Consider moving exposed services to DMZ
- Implement firewall rules between network segments
- Use VLANs to isolate public-facing services
- Monitor inter-service communication
```
## 🌐 External Access Methods & Alternatives
### 🔌 Primary Access (Port Forwarding)
```
# Direct external access via domain names (DDNS updated every 5 minutes)
https://pw.vish.gg:9443 # Portainer
https://meet.thevish.io:4443 # Jitsi Meet (primary)
ssh://git@git.vish.gg:2222 # Gitea SSH
# Alternative domain access
https://vish.gg:9443 # Portainer (main domain)
https://meet.vish.gg:4443 # Jitsi Meet (alt domain)
https://www.vish.gg # Main web services (HTTPS)
https://vish.gg # Main web services (HTTPS)
# Additional service domains (from Cloudflare DNS)
https://cal.vish.gg # Calendar service (proxied)
https://reddit.vish.gg # Reddit alternative (proxied)
https://www.thevish.io # Alternative main domain (proxied)
https://matrix.thevish.io # Matrix chat server (proxied)
https://joplin.thevish.io # Joplin notes (proxied)
```
### 🔗 Alternative Access (Tailscale VPN)
```
# Secure mesh VPN access (recommended for admin)
https://atlantis.tail.vish.gg:9443 # Portainer via Tailscale
https://atlantis.tail.vish.gg:4443 # Jitsi via Tailscale
ssh://git@calypso.tail.vish.gg:2222 # Gitea via Tailscale
# Benefits of Tailscale access:
- No port forwarding required
- End-to-end encryption
- Access control via Tailscale ACLs
- No exposure to internet threats
```
### 🔄 Hybrid Approach (Recommended)
```
# Public Services (External Access)
- Jitsi Meet: External users need direct access
- Web Services: Public content via port forwarding
- Git Repository: Public repositories via HTTPS
# Admin Services (Tailscale Access)
- Portainer: Container management via VPN
- Gitea Admin: Administrative functions via VPN
- Monitoring: Grafana, Prometheus via VPN
```
## 🔄 Dynamic DNS (DDNS) Configuration
### 🌐 Automated DDNS Updates
```
# Cloudflare DDNS Configuration
- Update Frequency: Every 5 minutes
- Domains: vish.gg and thevish.io
- Record Types: IPv4 (A) and IPv6 (AAAA)
- Automation: 4 DDNS services running
# DDNS Services:
- ddns-vish-proxied: Updates proxied A records for vish.gg
- ddns-vish-unproxied: Updates DNS-only A records for vish.gg
- ddns-thevish-proxied: Updates proxied records for thevish.io
- ddns-thevish-unproxied: Updates DNS-only records for thevish.io
```
### 📊 Service Categories
```
# Proxied Services (Cloudflare Protection)
- cal.vish.gg, reddit.vish.gg, www.vish.gg
- matrix.thevish.io, joplin.thevish.io, www.thevish.io
- Benefits: DDoS protection, caching, SSL termination
# DNS-Only Services (Direct Access)
- git.vish.gg, meet.thevish.io, pw.vish.gg
- api.vish.gg, spotify.vish.gg
- Benefits: Direct connection, no proxy overhead
```
## 🚨 Troubleshooting & Diagnostics
### 🔍 Common Issues & Solutions
#### Service Not Accessible Externally
```
# Diagnostic Steps:
1. Verify port forward rule is enabled in router
2. Confirm internal service is running on host
3. Test internal access first (192.168.0.x:port)
4. Check firewall rules on target host
5. Verify router external IP hasn't changed
6. Test DNS resolution: nslookup domain.com
# Commands:
docker-compose ps # Check service status
netstat -tulpn | grep PORT # Verify port binding
nmap -p PORT domain.com # Test external access
curl -I https://domain.com # HTTP connectivity test
```
#### Jitsi Meet Connection Issues
```
# WebRTC requires all ports - test each:
nmap -p 4443 meet.thevish.io # Web interface
nmap -p 3478 meet.thevish.io # STUN server
nmap -p 5349 meet.thevish.io # TURN server
nmap -p 49160-49200 meet.thevish.io # RTP range
# Browser diagnostics:
1. Open browser developer tools
2. Go to Network tab during call
3. Look for STUN/TURN connection attempts
4. Check for WebRTC errors in console
5. Test with different networks/devices
```
#### Gitea SSH Access Problems
```
# SSH troubleshooting steps:
ssh -p 2222 git@git.vish.gg # Test SSH connection
ssh-add -l # Check loaded SSH keys
cat ~/.ssh/id_rsa.pub # Verify public key
nmap -p 2222 git.vish.gg # Test port accessibility
# Gitea-specific checks:
docker-compose logs gitea | grep ssh
# Check Gitea SSH configuration in admin panel
# Verify SSH key is added to Gitea user account
```
#### Portainer Access Issues
```
# Test all Portainer ports:
curl -I https://pw.vish.gg:9443 # Main interface
curl -I https://pw.vish.gg:8000 # Edge Agent
curl -I https://pw.vish.gg:10000 # Additional services
# Container diagnostics:
docker-compose logs portainer
docker stats portainer
# Check Portainer logs for authentication errors
```
### 🔧 Performance Optimization
#### Network Performance
```
# Monitor bandwidth usage:
iftop -i eth0 # Real-time bandwidth
vnstat -i eth0 # Historical usage
speedtest-cli # Internet speed test
# Optimize for concurrent users:
# Jitsi: Increase JVB memory allocation
# Gitea: Configure Git LFS for large files
# Portainer: Increase container resources
```
#### Service Performance
```
# Resource monitoring:
docker stats # Container resource usage
htop # System resource usage
df -h # Disk space usage
# Service-specific optimization:
# Jitsi: Configure for expected concurrent meetings
# Nginx: Enable gzip compression and caching
# Database: Optimize PostgreSQL settings
```
## 📋 Maintenance & Configuration Management
### 🔄 Regular Maintenance Tasks
#### Monthly Tasks
```
# Security and monitoring:
□ Review access logs for all forwarded services
□ Test external access to all forwarded ports
□ Update service passwords and SSH keys
□ Backup router configuration
□ Verify DDNS updates are working
□ Check SSL certificate expiration dates
```
#### Quarterly Tasks
```
# Comprehensive review:
□ Security audit of exposed services
□ Update all forwarded services to latest versions
□ Review and optimize port forwarding rules
□ Test disaster recovery procedures
□ Audit user accounts and permissions
□ Review and update documentation
```
#### Annual Tasks
```
# Major maintenance:
□ Complete security assessment
□ Review and update network architecture
□ Evaluate need for additional security measures
□ Plan for service migrations or updates
□ Review and update disaster recovery plans
□ Comprehensive backup and restore testing
```
### 📊 Configuration Backup & Documentation
#### Router Configuration
```
# TP-Link Archer BE800 backup:
- Export configuration monthly
- Document all port forward changes
- Maintain change log with dates and reasons
- Store backup files securely
- Test configuration restoration procedures
```
#### Service Health Monitoring
```
# Automated monitoring setup:
- Uptime monitoring for each forwarded port
- Health checks for critical services
- Alerts for service failures
- Performance metrics collection
- Log aggregation and analysis
```
## 🔗 Integration with Homelab Infrastructure
### 🌐 Tailscale Mesh Integration
```
# Secure internal access alternatives:
https://atlantis.tail.vish.gg:9443 # Portainer
https://atlantis.tail.vish.gg:4443 # Jitsi Meet
ssh://git@calypso.tail.vish.gg:2222 # Gitea SSH
# Benefits:
- No port forwarding required for admin access
- End-to-end encryption via WireGuard
- Access control via Tailscale ACLs
- Works from anywhere with internet
```
### 📊 Monitoring Integration
```
# Service monitoring via Grafana/Prometheus:
- External service availability monitoring
- Response time tracking
- Error rate monitoring
- Resource usage correlation
- Alert integration with notification services
```
### 🔄 Backup Integration
```
# Service data backup:
- Gitea repositories: automated Git backups
- Portainer configurations: volume backups
- Jitsi recordings: cloud storage sync
- Web service data: regular file system backups
```
---
*Last Updated: 2025-11-17*
*Active Port Forwards: 10 rules across 2 hosts*
*External Domains: 12 with automatic DDNS updates*
*DDNS Update Frequency: Every 5 minutes via Cloudflare*
*Security Status: All services monitored and hardened*

View File

@@ -0,0 +1,329 @@
# 🚀 Quick Start Guide
**🟢 Beginner-Friendly**
Get up and running with your first homelab service in under 30 minutes! This guide will walk you through deploying a simple service using the established patterns from this homelab.
## 🎯 What We'll Build
We'll deploy **Uptime Kuma** - a simple, beginner-friendly monitoring tool that will:
- Monitor your other services
- Send you alerts when things go down
- Provide a beautiful dashboard
- Teach you the basic deployment patterns
## 📋 Prerequisites
### ✅ What You Need
- A computer running Linux (Ubuntu, Debian, or similar)
- Docker and Docker Compose installed
- Basic command line knowledge
- 30 minutes of time
### 🔧 Install Docker (if needed)
```bash
# Update system
sudo apt update && sudo apt upgrade -y
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add your user to docker group
sudo usermod -aG docker $USER
# Install Docker Compose
sudo apt install docker-compose -y
# Verify installation
docker --version
docker-compose --version
```
## 📁 Step 1: Create Project Structure
```bash
# Create project directory
mkdir -p ~/homelab/monitoring
cd ~/homelab/monitoring
# Create the directory structure
mkdir -p uptime-kuma/data
```
## 📝 Step 2: Create Docker Compose File
Create the main configuration file:
```bash
cat > uptime-kuma/docker-compose.yml << 'EOF'
version: '3.9'
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: Uptime-Kuma
hostname: uptime-kuma
# Security settings
security_opt:
- no-new-privileges:true
user: 1000:1000 # Adjust for your system
# Health check
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3001/api/status-page/heartbeat/default"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# Restart policy
restart: on-failure:5
# Resource limits
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
# Port mapping
ports:
- "3001:3001"
# Data persistence
volumes:
- ./data:/app/data:rw
- /etc/localtime:/etc/localtime:ro
# Environment variables
environment:
- TZ=America/Los_Angeles # Change to your timezone
# Custom network
networks:
- monitoring-network
networks:
monitoring-network:
name: monitoring-network
ipam:
config:
- subnet: 192.168.100.0/24
EOF
```
## 🔧 Step 3: Configure Environment
Create an environment file for easy customization:
```bash
cat > uptime-kuma/.env << 'EOF'
# Timezone (change to your location)
TZ=America/Los_Angeles
# User ID and Group ID (run 'id' command to find yours)
PUID=1000
PGID=1000
# Port (change if 3001 is already in use)
PORT=3001
EOF
```
## 🚀 Step 4: Deploy the Service
```bash
# Navigate to the service directory
cd uptime-kuma
# Start the service
docker-compose up -d
# Check if it's running
docker-compose ps
# View logs
docker-compose logs -f
```
You should see output like:
```
uptime-kuma_1 | Welcome to Uptime Kuma
uptime-kuma_1 | Server is running on port 3001
```
## 🌐 Step 5: Access Your Service
1. **Open your web browser**
2. **Navigate to**: `http://your-server-ip:3001`
3. **Create admin account** on first visit
4. **Start monitoring services!**
## 🎯 Step 6: Add Your First Monitor
1. **Click "Add New Monitor"**
2. **Configure a basic HTTP monitor**:
- **Monitor Type**: HTTP(s)
- **Friendly Name**: Google
- **URL**: https://google.com
- **Heartbeat Interval**: 60 seconds
3. **Click "Save"**
Congratulations! You've deployed your first homelab service! 🎉
## 🔍 Understanding What We Built
### 📦 Docker Compose Structure
```yaml
# This tells Docker what version of compose syntax we're using
version: '3.9'
# Services section defines our containers
services:
uptime-kuma: # Service name
image: louislam/uptime-kuma # Docker image to use
container_name: Uptime-Kuma # Custom container name
ports: # Port mapping (host:container)
- "3001:3001"
volumes: # Data persistence
- ./data:/app/data:rw # Maps local ./data to container /app/data
environment: # Environment variables
- TZ=America/Los_Angeles
```
### 🔐 Security Features
- **no-new-privileges**: Prevents privilege escalation
- **User mapping**: Runs as non-root user
- **Resource limits**: Prevents resource exhaustion
- **Health checks**: Monitors service health
### 📊 Monitoring Features
- **Health checks**: Docker monitors the container
- **Restart policy**: Automatically restarts on failure
- **Logging**: All output captured by Docker
## 🎓 Next Steps - Expand Your Homelab
### 🟢 Beginner Services (Try Next)
1. **Pi-hole** - Block ads network-wide
```bash
# Copy the uptime-kuma pattern and adapt for Pi-hole
mkdir ~/homelab/pihole
# Use the Pi-hole configuration from Atlantis/pihole.yml
```
2. **Portainer** - Manage Docker containers with a web UI
```bash
mkdir ~/homelab/portainer
# Adapt the pattern for Portainer
```
3. **Nginx Proxy Manager** - Manage reverse proxy with SSL
```bash
mkdir ~/homelab/proxy
# Use the pattern from Atlantis/nginxproxymanager/
```
### 🟡 Intermediate Services (When Ready)
1. **Plex or Jellyfin** - Media streaming
2. **Vaultwarden** - Password manager
3. **Grafana + Prometheus** - Advanced monitoring
### 🔴 Advanced Services (For Later)
1. **GitLab** - Complete DevOps platform
2. **Home Assistant** - Smart home automation
3. **Matrix Synapse** - Decentralized chat
## 🛠️ Common Customizations
### 🔧 Change the Port
If port 3001 is already in use:
```yaml
ports:
- "3002:3001" # Use port 3002 instead
```
### 🔧 Different Data Location
To store data elsewhere:
```yaml
volumes:
- /home/user/uptime-data:/app/data:rw
```
### 🔧 Add Resource Limits
For a more powerful server:
```yaml
deploy:
resources:
limits:
memory: 1G
cpus: '1.0'
```
## 🚨 Troubleshooting
### ❌ Service Won't Start
```bash
# Check logs for errors
docker-compose logs
# Check if port is already in use
sudo netstat -tulpn | grep :3001
# Check file permissions
ls -la data/
```
### ❌ Can't Access Web Interface
```bash
# Check if container is running
docker ps
# Test internal connectivity
docker exec Uptime-Kuma curl http://localhost:3001
# Check firewall
sudo ufw status
sudo ufw allow 3001
```
### ❌ Data Not Persisting
```bash
# Check volume mount
docker inspect Uptime-Kuma | grep -A 10 Mounts
# Fix permissions
sudo chown -R 1000:1000 ./data
```
## 🎯 What You've Learned
**Docker Compose basics**
**Service deployment patterns**
**Data persistence with volumes**
**Network configuration**
**Security best practices**
**Health monitoring**
**Troubleshooting basics**
## 📋 Next Reading
- **[03-Architecture-Overview](03-Architecture-Overview.md)**: Understand how everything fits together
- **[20-Service-Categories](20-Service-Categories.md)**: Explore what services are available
- **[30-Deployment-Guide](30-Deployment-Guide.md)**: Learn advanced deployment patterns
- **[40-Common-Issues](40-Common-Issues.md)**: Troubleshoot problems
---
**🎉 Congratulations!** You've successfully deployed your first homelab service using the same patterns used across all 176 services in this infrastructure. You're now ready to explore more complex services and build your own homelab empire!
*Remember: Every expert was once a beginner. Start small, learn continuously, and don't be afraid to break things - that's how you learn!*
## 🔗 Related Documents
- **[00-Homelab-Documentation-Index](00-Homelab-Documentation-Index.md)**: Main documentation index
- **[01-What-is-a-Homelab](01-What-is-a-Homelab.md)**: Understanding homelabs
- **[04-Prerequisites](04-Prerequisites.md)**: What you need before starting
- **[22-Popular-Services](22-Popular-Services.md)**: Essential services to deploy next

View File

@@ -0,0 +1,235 @@
# 📚 Individual Service Documentation Index
This comprehensive index contains detailed documentation for all **159 services** running across the homelab infrastructure. Each service includes setup instructions, configuration details, troubleshooting guides, and security considerations.
> **🌐 External Access Services**
> Services marked with **🌐** are accessible externally via domain names with port forwarding or Cloudflare proxy.
## 🎯 How to Use This Documentation
Each service documentation includes:
- **Service Overview**: Host, category, difficulty level
- **Purpose**: What the service does and why it's useful
- **Quick Start**: Step-by-step deployment instructions
- **Configuration**: Complete Docker Compose setup
- **Environment Variables**: All configuration options
- **Port & Volume Mappings**: Network and storage details
- **Access Information**: How to reach the service
- **Security Considerations**: Best practices and recommendations
- **Troubleshooting**: Common issues and solutions
- **Related Services**: Dependencies and integrations
## 📋 Services by Category
### 🤖 AI (1 service)
- 🟢 **Ollama** - guava - Large language model server
### 💬 Communication (10 services)
- 🟢 **Element Web** - anubis - Matrix web client
- 🟡 **Jicofo** - Atlantis - Jitsi conference focus
- 🟡 **JVB** - Atlantis - Jitsi video bridge
- 🔴 **Mastodon** - Atlantis - Decentralized social network
- 🔴 **Mastodon DB** - Atlantis - Mastodon database
- 🔴 **Mastodon Redis** - Atlantis - Mastodon cache
- 🟡 **Mattermost** - homelab_vm - Team collaboration platform
- 🟡 **Mattermost DB** - homelab_vm - Mattermost database
- 🟢 **Prosody** - Atlantis - XMPP server
- 🟢 **Signal CLI REST API** - homelab_vm - Signal messaging API
### 🛠️ Development (4 services)
- 🟢 **Companion** - concord_nuc - Development companion tool
- 🟢 **Inv Sig Helper** - concord_nuc - Invidious signature helper
- 🟡 **Invidious** - concord_nuc - YouTube frontend
- 🟢 **Redlib** - Atlantis - Reddit frontend
### 🎮 Gaming (1 service)
- 🟢 **Satisfactory Server** - homelab_vm - Factory building game server
### 🎬 Media (20 services)
- 🟢 **Bazarr** - Calypso - Subtitle management
- 🟢 **Calibre Web** - Atlantis - E-book library web interface
- 🟡 **Database** - raspberry-pi-5-vish - Media database
- 🟡 **Immich DB** - Calypso - Immich photo database
- 🟡 **Immich Machine Learning** - Calypso - Immich ML processing
- 🟡 **Immich Redis** - Calypso - Immich cache
- 🟡 **Immich Server** - raspberry-pi-5-vish - Photo management server
- 🟢 **Jackett** - Atlantis - Torrent indexer proxy
- 🟡 **Jellyfin** - Chicago_vm - Media server
- 🟢 **Lidarr** - Calypso - Music collection manager
- 🟢 **LinuxServer Prowlarr** - Calypso - Indexer manager
- 🟢 **Navidrome** - Bulgaria_vm - Music streaming server
- 🟡 **PhotoPrism** - anubis - AI-powered photo management
- 🟢 **Plex** - Calypso - Media server and streaming
- 🟢 **Prowlarr** - Calypso - Indexer manager
- 🟢 **Radarr** - Calypso - Movie collection manager
- 🟢 **Readarr** - Calypso - Book collection manager
- 🟢 **RomM** - homelab_vm - ROM management
- 🟢 **Sonarr** - Calypso - TV series collection manager
- 🟢 **Tautulli** - Calypso - Plex monitoring and statistics
### 📊 Monitoring (11 services)
- 🟡 **Blackbox Exporter** - Calypso - HTTP/HTTPS monitoring
- 🟡 **cAdvisor** - Calypso - Container resource monitoring
- 🟡 **Dash.** - homelab_vm - Server dashboard
- 🟡 **Grafana** - Calypso - Metrics visualization
- 🟡 **Node Exporter** - Calypso - System metrics exporter
- 🟡 **Prometheus** - Calypso - Metrics collection and storage
- 🟡 **SNMP Exporter** - Calypso - SNMP metrics exporter
- 🟡 **Speedtest Exporter** - Calypso - Internet speed monitoring
- 🟡 **Uptime Kuma** - Atlantis - Uptime monitoring
- 🟡 **Watchtower** - Atlantis - Container update automation
- 🟡 **WatchYourLAN** - homelab_vm - Network device monitoring
### 🌐 Networking (8 services)
- 🟡 **DDNS Crista Love** - guava - Dynamic DNS updater
- 🟡 **DDNS TheVish Proxied** - Atlantis - Dynamic DNS with proxy
- 🟡 **DDNS TheVish Unproxied** - Atlantis - Dynamic DNS direct
- 🟡 **DDNS Updater** - homelab_vm - Dynamic DNS service
- 🟡 **DDNS Vish 13340** - concord_nuc - Dynamic DNS on port 13340
- 🟡 **DDNS Vish Proxied** - Atlantis - Dynamic DNS with proxy
- 🟡 **DDNS Vish Unproxied** - Atlantis - Dynamic DNS direct
- 🟡 **Nginx Proxy Manager** - Atlantis - Reverse proxy management
### 🔧 Other Services (104 services)
- 🟢 **Actual Server** - Chicago_vm - Budget management
- 🟡 **AdGuard** - Chicago_vm - DNS ad blocking
- 🟢 **API** - Atlantis - API service
- 🟢 **App** - Atlantis - Application service
- 🔴 **APT Cacher NG** - Chicago_vm - Package caching proxy
- 🟢 **APT Repo** - Atlantis - APT repository
- 🟡 **ArchiveBox** - anubis - Web archiving
- 🟡 **ArchiveBox Scheduler** - guava - Archive scheduling
- 🟡 **Baikal** - Atlantis - CalDAV/CardDAV server
- 🟢 **BG Helper** - concord_nuc - Background helper service
- 🟢 **Binternet** - homelab_vm - Binary internet service
- 🟢 **Cache** - Chicago_vm - Caching service
- 🟢 **Chrome** - Calypso - Headless Chrome browser
- 🟢 **Cloudflare DNS Updater** - raspberry-pi-5-vish - DNS updater
- 🔴 **CoCalc** - guava - Collaborative calculation platform
- 🟢 **Coturn** - Atlantis - TURN/STUN server
- 🟢 **Cron** - Chicago_vm - Scheduled task runner
- 🟢 **Database** - raspberry-pi-5-vish - Database service
- 🟢 **DB** - Atlantis - Database service
- 🟢 **Deiucanta** - anubis - Custom service
- 🟢 **DockPeek** - Atlantis - Docker container inspector
- 🟢 **Documenso** - Atlantis - Document signing platform
- 🟢 **DokuWiki** - Atlantis - Wiki platform
- 🟢 **Dozzle** - Atlantis - Docker log viewer
- 🟢 **Draw.io** - anubis - Diagram creation tool
- 🟢 **Droppy** - homelab_vm - File sharing platform
- 🟢 **Fasten** - guava - Health record management
- 🟢 **Fenrus** - Atlantis - Application dashboard
- 🟡 **Firefly** - Atlantis - Personal finance manager
- 🟡 **Firefly DB** - Atlantis - Firefly database
- 🟡 **Firefly DB Backup** - Atlantis - Database backup service
- 🟡 **Firefly Redis** - Atlantis - Firefly cache
- 🟢 **FlareSolverr** - Calypso - Cloudflare bypass proxy
- 🟢 **Front** - Atlantis - Frontend service
- 🟢 **Gotenberg** - Atlantis - Document conversion API
- 🟢 **Gotify** - homelab_vm - Push notification server
- 🟢 **Home Assistant** - concord_nuc - Home automation platform
- 🟢 **Hyperpipe Back** - Atlantis - YouTube Music backend
- 🟢 **Hyperpipe Front** - Atlantis - YouTube Music frontend
- 🟢 **Importer** - Chicago_vm - Data import service
- 🟢 **Invidious DB** - concord_nuc - Invidious database
- 🟢 **iPerf3** - Atlantis - Network performance testing
- 🟢 **IT Tools** - Atlantis - IT utility collection
- 🟢 **JDownloader 2** - Atlantis - Download manager
- 🟢 **Jellyseerr** - Calypso - Media request management
- 🟢 **LibReddit** - homelab_vm - Reddit frontend
- 🟢 **LinuxGSM L4D2** - homelab_vm - Left 4 Dead 2 server
- 🟢 **LinuxGSM PMC Bind** - homelab_vm - Game server binding
- 🟢 **Materialious** - concord_nuc - Material design frontend
- 🔴 **Matrix Conduit** - anubis - Lightweight Matrix server
- 🟢 **Matter Server** - concord_nuc - Matter protocol server
- 🟢 **Meilisearch** - homelab_vm - Search engine
- 🟢 **MeTube** - homelab_vm - YouTube downloader
- 🟢 **MinIO** - Calypso - Object storage server
- 🟢 **MongoDB** - Chicago_vm - NoSQL database
- 🟢 **Neko Rooms** - Chicago_vm - Virtual browser rooms
- 🔴 **NetBox** - Atlantis - Network documentation
- 🟡 **NetBox DB** - Atlantis - NetBox database
- 🟡 **NetBox Redis** - Atlantis - NetBox cache
- 🟢 **Nginx** - Atlantis - Web server
- 🟢 **ntfy** - Atlantis - Push notification service
- 🟢 **OpenProject** - homelab_vm - Project management
- 🟢 **Open WebUI** - guava - AI chat interface
- 🟢 **Pi.Alert** - anubis - Network device scanner
- 🟡 **Pi-hole** - Atlantis - DNS ad blocker
- 🟢 **Piped** - concord_nuc - YouTube frontend
- 🟢 **Piped Back** - Atlantis - Piped backend
- 🟢 **Piped Front** - Atlantis - Piped frontend
- 🟢 **Piped Frontend** - concord_nuc - Piped web interface
- 🟢 **Piped Proxy** - Atlantis - Piped proxy service
- 🟢 **PodGrab** - homelab_vm - Podcast downloader
- 🟢 **PostgreSQL** - concord_nuc - Relational database
- 🟢 **ProtonMail Bridge** - homelab_vm - ProtonMail IMAP/SMTP
- 🟢 **ProxiTok** - anubis - TikTok frontend
- 🟢 **RainLoop** - homelab_vm - Web email client
- 🟢 **Redis** - Atlantis - In-memory data store
- 🟢 **Resume** - Calypso - Resume/CV service
- 🟢 **Roundcube** - homelab_vm - Web email client
- 🟢 **Roundcube ProtonMail** - homelab_vm - Roundcube for ProtonMail
- 🟢 **SABnzbd** - Calypso - Usenet downloader
- 🟢 **Seafile** - Chicago_vm - File sync and share
- 🟢 **Server** - homelab_vm - Generic server service
- 🟢 **Shlink** - homelab_vm - URL shortener
- 🟢 **Shlink DB** - homelab_vm - Shlink database
- 🟢 **Shlink Web** - homelab_vm - Shlink web interface
- 🟢 **Signer** - Chicago_vm - Document signing service
- 🟢 **Sonic** - guava - Search backend
- 🟢 **Stirling PDF** - Atlantis - PDF manipulation tools
- 🔴 **Synapse** - Atlantis - Matrix homeserver
- 🟡 **Synapse DB** - Atlantis - Synapse database
- 🟢 **Syncthing** - homelab_vm - File synchronization
- 🟢 **Termix** - Atlantis - Terminal service
- 🟢 **Tika** - Atlantis - Content analysis toolkit
- 🔴 **Vaultwarden** - Atlantis - Password manager
- 🟢 **Web** - Calypso - Web service
- 🟢 **WebCheck** - homelab_vm - Website analyzer
- 🟢 **WebCord** - homelab_vm - Discord client
- 🟢 **WebServer** - Atlantis - Web server service
- 🟢 **WebUI** - guava - Web interface
- 🟡 **WG Easy** - concord_nuc - WireGuard VPN manager
- 🟡 **WGEasy** - Atlantis - WireGuard VPN interface
- 🟢 **Whisparr** - Calypso - Adult content manager
- 🟢 **Wizarr** - Calypso - User invitation system
- 🟢 **YouTube Downloader** - Atlantis - YouTube video downloader
## 📊 Statistics
- **Total Services**: 159
- **Categories**: 7
- **Hosts**: 13
- **Beginner-Friendly (🟢)**: 104 services
- **Intermediate (🟡)**: 42 services
- **Advanced (🔴)**: 13 services
## 🔍 Quick Search Tips
1. **By Category**: Use the category sections above
2. **By Difficulty**: Look for the colored indicators (🟢🟡🔴)
3. **By Host**: Services are listed with their host names
4. **By Function**: Service names often indicate their purpose
## 💡 Usage Tips
- **Start with 🟢 services** if you're new to homelabs
- **🟡 services** require basic Docker/Linux knowledge
- **🔴 services** need significant technical expertise
- Check the main documentation for deployment patterns
- Use the troubleshooting guides for common issues
## 🔗 Related Documentation
- [02-Quick-Start-Guide](02-Quick-Start-Guide.md) - Getting started
- [22-Popular-Services](22-Popular-Services.md) - Most commonly used services
- [30-Deployment-Guide](30-Deployment-Guide.md) - How to deploy services
- [40-Common-Issues](40-Common-Issues.md) - Troubleshooting help
---
*This index provides an overview of all individual service documentation. Each service has its own detailed guide with complete setup and configuration instructions.*
*Last Updated: November 2024*
*Total Services Documented: 159*

View File

@@ -0,0 +1,254 @@
# ⭐ Popular Services Guide
**🟡 Intermediate Guide**
This guide covers the most popular and useful services in the homelab, with detailed setup instructions and real-world usage examples. These services provide the most value and are great starting points for any homelab.
## 🎯 Top 10 Must-Have Services
| Rank | Service | Category | Difficulty | Why It's Essential |
|------|---------|----------|------------|-------------------|
| 1 | **Uptime Kuma** | Monitoring | 🟢 | Know when services go down |
| 2 | **Plex/Jellyfin** | Media | 🟢 | Your personal Netflix |
| 3 | **Vaultwarden** | Security | 🟡 | Secure password management |
| 4 | **Pi-hole** | Security | 🟡 | Block ads network-wide |
| 5 | **Portainer** | Management | 🟡 | Manage Docker containers easily |
| 6 | **Immich** | Media | 🟡 | Your personal Google Photos |
| 7 | **Nginx Proxy Manager** | Infrastructure | 🟡 | Manage web services with SSL |
| 8 | **Paperless-NGX** | Productivity | 🟡 | Go completely paperless |
| 9 | **Grafana + Prometheus** | Monitoring | 🔴 | Advanced system monitoring |
| 10 | **Syncthing** | Storage | 🟡 | Sync files without cloud |
---
## 1⃣ Uptime Kuma - Service Monitoring
**🟢 Beginner-Friendly | Essential for Everyone**
### 🎯 What It Does
- Monitors all your services 24/7
- Sends alerts when services go down
- Beautiful dashboard showing service status
- Tracks uptime statistics and response times
### 🚀 Quick Setup
```yaml
version: '3.9'
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: Uptime-Kuma
ports:
- "3001:3001"
volumes:
- ./data:/app/data
environment:
- TZ=America/Los_Angeles
restart: on-failure:5
```
### 🔧 Configuration Tips
- **First setup**: Create admin account immediately
- **Monitor types**: HTTP, TCP, Ping, DNS, Docker containers
- **Notifications**: Set up email, Discord, Slack alerts
- **Status pages**: Create public status pages for users
### 💡 Pro Tips
- Monitor your router/modem for internet connectivity
- Set up keyword monitoring for login pages
- Use different check intervals (60s for critical, 300s for others)
- Create notification groups to avoid spam
---
## 2⃣ Plex - Media Streaming Server
**🟢 Beginner-Friendly | Entertainment Essential**
### 🎯 What It Does
- Stream movies, TV shows, music to any device
- Automatic metadata and artwork fetching
- User management with sharing capabilities
- Mobile apps for iOS/Android
### 🚀 Quick Setup
```yaml
version: '3.9'
services:
plex:
image: plexinc/pms-docker:latest
container_name: Plex
hostname: plex-server
ports:
- "32400:32400"
environment:
- TZ=America/Los_Angeles
- PLEX_CLAIM=claim-xxxxxxxxxxxx # Get from plex.tv/claim
- PLEX_UID=1026
- PLEX_GID=100
volumes:
- ./config:/config
- /volume1/media/movies:/movies:ro
- /volume1/media/tv:/tv:ro
- /volume1/media/music:/music:ro
restart: on-failure:5
```
### 📁 Media Organization
```
/volume1/media/
├── movies/
│ ├── Avatar (2009)/
│ │ └── Avatar (2009).mkv
│ └── Inception (2010)/
│ └── Inception (2010).mkv
├── tv/
│ ├── Breaking Bad/
│ │ ├── Season 01/
│ │ └── Season 02/
│ └── The Office/
└── music/
├── Artist Name/
│ └── Album Name/
└── Various Artists/
```
### 🔧 Essential Settings
- **Remote Access**: Enable for mobile access
- **Hardware Transcoding**: Enable if you have Intel/NVIDIA GPU
- **Libraries**: Separate libraries for Movies, TV, Music
- **Users**: Create accounts for family members
### 💡 Pro Tips
- Use Plex naming conventions for best metadata
- Enable "Empty trash automatically"
- Set up Tautulli for usage statistics
- Consider Plex Pass for premium features
---
## 3⃣ Vaultwarden - Password Manager
**🟡 Intermediate | Security Essential**
### 🎯 What It Does
- Stores all passwords securely encrypted
- Generates strong passwords automatically
- Syncs across all devices (phone, computer, browser)
- Compatible with Bitwarden apps
### 🚀 Quick Setup
```yaml
version: '3.9'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: Vaultwarden
ports:
- "8012:80"
volumes:
- ./data:/data
environment:
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=true # Disable after creating accounts
- ADMIN_TOKEN=REDACTED_TOKEN
- DOMAIN=https://vault.yourdomain.com
restart: on-failure:5
```
### 🔐 Security Setup
1. **Create admin token**: `openssl rand -base64 48`
2. **Disable signups** after creating accounts
3. **Enable 2FA** for all accounts
4. **Set up HTTPS** with reverse proxy
5. **Regular backups** of `/data` directory
### 📱 Client Setup
- **Browser**: Install Bitwarden extension
- **Mobile**: Download Bitwarden app
- **Desktop**: Bitwarden desktop application
- **Server URL**: Point to your Vaultwarden instance
### 💡 Pro Tips
- Use organization vaults for shared passwords
- Set up emergency access for family
- Enable breach monitoring if available
- Regular password audits for weak/reused passwords
---
## 🚀 Getting Started Recommendations
### 🎯 Week 1: Foundation
1. **Uptime Kuma**: Monitor your services
2. **Portainer**: Manage Docker containers
3. **Nginx Proxy Manager**: Set up reverse proxy
### 🎯 Week 2: Core Services
4. **Vaultwarden**: Secure password management
5. **Pi-hole**: Block ads network-wide
6. **Plex/Jellyfin**: Start your media server
### 🎯 Week 3: Productivity
7. **Immich**: Photo management
8. **Paperless-NGX**: Document digitization
9. **Syncthing**: File synchronization
### 🎯 Week 4: Advanced
10. **Grafana + Prometheus**: Advanced monitoring
## 📊 Service Comparison
### 🎬 Media Servers
| Feature | Plex | Jellyfin | Emby |
|---------|------|----------|------|
| **Cost** | Free/Premium | Free | Free/Premium |
| **Ease of Use** | Excellent | Good | Good |
| **Mobile Apps** | Excellent | Good | Good |
| **Hardware Transcoding** | Premium | Free | Premium |
| **Plugins** | Limited | Extensive | Moderate |
### 🔐 Password Managers
| Feature | Vaultwarden | Bitwarden | 1Password |
|---------|-------------|-----------|-----------|
| **Self-hosted** | Yes | No | No |
| **Cost** | Free | Free/Premium | Premium |
| **Features** | Full | Limited/Full | Full |
| **Mobile Apps** | Yes | Yes | Yes |
| **Browser Extensions** | Yes | Yes | Yes |
### 📊 Monitoring Solutions
| Feature | Uptime Kuma | Grafana | Zabbix |
|---------|-------------|---------|--------|
| **Complexity** | Low | Medium | High |
| **Features** | Basic | Advanced | Enterprise |
| **Setup Time** | 10 minutes | 2 hours | 8+ hours |
| **Resource Usage** | Low | Medium | High |
---
## 📋 Next Steps
### 🎯 After Popular Services
- **[20-Service-Categories](20-Service-Categories.md)**: Explore more specialized services
- **[21-Service-Index](21-Service-Index.md)**: Complete list of all available services
- **[30-Deployment-Guide](30-Deployment-Guide.md)**: Learn advanced deployment patterns
- **[50-Ansible-Automation](50-Ansible-Automation.md)**: Automation and scaling
### 🎯 Community Resources
- **r/homelab**: Reddit community for homelab enthusiasts
- **r/selfhosted**: Self-hosting community and discussions
- **Discord servers**: Real-time chat with other homelabbers
- **YouTube channels**: TechnoTim, NetworkChuck, Craft Computing
---
*These popular services form the backbone of most successful homelabs. Start with the ones that solve your immediate needs, then gradually expand your infrastructure as you become more comfortable with the technology.*
## 🔗 Related Documents
- **[00-Homelab-Documentation-Index](00-Homelab-Documentation-Index.md)**: Main documentation index
- **[02-Quick-Start-Guide](02-Quick-Start-Guide.md)**: Deploy your first service
- **[20-Service-Categories](20-Service-Categories.md)**: All service categories
- **[30-Deployment-Guide](30-Deployment-Guide.md)**: Deployment patterns
- **[40-Common-Issues](40-Common-Issues.md)**: Troubleshooting guide

107
archive/joplin/README.md Normal file
View File

@@ -0,0 +1,107 @@
# Joplin Documentation Format
This directory contains the homelab documentation formatted specifically for Joplin note-taking application. The files are organized with numbered prefixes for easy sorting and navigation.
## 📁 File Structure
Files are numbered for logical organization in Joplin:
- **00-09**: Index and overview documents
- `00-Homelab-Documentation-Index.md` - Main index
- **10-19**: Infrastructure and architecture
- `19-Individual-Service-Docs.md` - **NEW!** Complete index of all 159 individual service docs
- **20-29**: Services and applications
- `22-Popular-Services.md` - Popular services guide
- **30-39**: Administration and deployment
- **40-49**: Troubleshooting and maintenance
- **50-59**: Advanced topics and automation
## 🔧 How to Import into Joplin
### Option 1: Individual File Import
1. Open Joplin
2. Create a new notebook called "Homelab Documentation"
3. For each `.md` file:
- File → Import → Markdown files
- Select the file
- Import into the Homelab Documentation notebook
### Option 2: Bulk Import
1. Open Joplin
2. File → Import → Markdown files
3. Select all `.md` files in this directory
4. Choose "Homelab Documentation" as the destination notebook
### Option 3: Folder Import
1. Copy this entire `joplin/` directory to a temporary location
2. In Joplin: File → Import → Markdown files
3. Select the directory
4. All files will be imported with proper organization
## 🎨 Joplin-Specific Features
These files are optimized for Joplin with:
- **Numbered prefixes**: For automatic sorting
- **Cross-references**: Links between related documents
- **Table of contents**: In the main index file
- **Consistent formatting**: Standard Markdown with Joplin compatibility
- **Emoji icons**: For visual organization and quick identification
## 📱 Mobile Compatibility
These files work well on Joplin mobile apps:
- Tables are formatted for mobile viewing
- Code blocks are properly formatted
- Links work across devices
- Images and diagrams are optimized
## 🔍 Search and Organization
In Joplin, you can:
- **Search across all documents**: Use Joplin's full-text search
- **Tag documents**: Add tags like `#homelab`, `#docker`, `#beginner`
- **Create shortcuts**: Pin frequently accessed documents
- **Use notebooks**: Organize by topic or skill level
## 🔄 Keeping Updated
To update the documentation:
1. Replace the files in your Joplin notebook
2. Or re-import the updated files
3. Joplin will preserve your notes and annotations
## 📝 Customization
You can customize these files in Joplin:
- Add your own notes and annotations
- Create additional cross-references
- Add tags for better organization
- Modify formatting to your preferences
## 💡 Tips for Using in Joplin
1. **Create a dedicated notebook**: Keep all homelab docs together
2. **Use tags**: Tag documents by difficulty level or topic
3. **Pin important docs**: Pin the index and frequently used guides
4. **Enable synchronization**: Sync across all your devices
5. **Use the web clipper**: Add related articles and resources
## 🔗 Related
- Main documentation: `../docs/`
- DokuWiki format: `../dokuwiki/`
- Original repository structure: `../`
## 📋 Document Numbering System
- **00-09**: Overview and getting started
- **10-19**: Infrastructure and architecture
- **20-29**: Services and applications
- **30-39**: Administration and deployment
- **40-49**: Troubleshooting and maintenance
- **50-59**: Advanced topics and automation
- **60-69**: Reference materials (future use)
- **70-79**: Templates and examples (future use)
- **80-89**: Community and resources (future use)
- **90-99**: Appendices and extras (future use)

View File

@@ -0,0 +1,19 @@
FROM nginx:latest
# Copy custom configuration file
COPY nginx.conf /etc/nginx/nginx.conf
# Copy default site configuration
COPY default.conf /etc/nginx/conf.d/default.conf
# Create directory for website files
RUN mkdir -p /usr/share/nginx/html
# Copy website files
COPY index.html /usr/share/nginx/html/
# Expose port 80
EXPOSE 80
# Start Nginx
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -0,0 +1,19 @@
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

View File

@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Nginx Website</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin-top: 50px;
background-color: #f0f0f0;
}
h1 {
color: #333;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<div class="container">
<h1>Welcome to My Nginx Website</h1>
<p>This is a simple website served by Nginx using Docker.</p>
<p>Time: <span id="time"></span></p>
<script>
document.getElementById('time').textContent = new Date().toLocaleTimeString();
</script>
</div>
</body>
</html>

View File

@@ -0,0 +1,50 @@
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}

83
archive/nginx/nginx.conf Normal file
View File

@@ -0,0 +1,83 @@
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}

View File

@@ -0,0 +1,28 @@
# Redirect all HTTP traffic to HTTPS
server {
listen 80;
server_name client.spotify.vish.gg;
return 301 https://$host$request_uri;
}
# HTTPS configuration for the subdomain
server {
listen 443 ssl;
server_name client.spotify.vish.gg;
# SSL Certificates (managed by Certbot)
ssl_certificate /etc/letsencrypt/live/client.spotify.vish.gg/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/client.spotify.vish.gg/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
# Proxy to Docker container
location / {
proxy_pass http://127.0.0.1:4000; # Maps to your Docker container
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

View File

@@ -0,0 +1,163 @@
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
#location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
# fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
server {
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name spotify.vish.gg; # managed by Certbot
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
#location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
# fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/spotify.vish.gg/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/spotify.vish.gg/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = spotify.vish.gg) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name spotify.vish.gg;
return 404; # managed by Certbot
}

View File

@@ -0,0 +1,36 @@
server {
if ($host = in.vish.gg) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name in.vish.gg;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name in.vish.gg;
# SSL Certificates (replace with your actual Certbot paths)
ssl_certificate /etc/letsencrypt/live/in.vish.gg/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/in.vish.gg/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Reverse Proxy to Invidious running on port 3000
location / {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
ssl_certificate /etc/letsencrypt/live/in.vish.gg/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/in.vish.gg/privkey.pem; # managed by Certbot
}

View File

@@ -0,0 +1,28 @@
# Redirect HTTP to HTTPS
server {
listen 80;
server_name spotify.vish.gg;
return 301 https://$host$request_uri;
}
# HTTPS server block
server {
listen 443 ssl;
server_name spotify.vish.gg;
# SSL Certificates (managed by Certbot)
ssl_certificate /etc/letsencrypt/live/spotify.vish.gg/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/spotify.vish.gg/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Proxy requests to backend API
location / {
proxy_pass http://127.0.0.1:15000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

View File

@@ -0,0 +1,74 @@
# Redirect HTTP to HTTPS
server {
listen 80;
server_name vp.vish.gg api.vp.vish.gg proxy.vp.vish.gg;
return 301 https://$host$request_uri;
}
# HTTPS Reverse Proxy for Piped
server {
listen 443 ssl http2;
server_name vp.vish.gg;
# SSL Certificates (managed by Certbot)
ssl_certificate /etc/letsencrypt/live/vp.vish.gg/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vp.vish.gg/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Proxy requests to Piped Frontend (use Docker service name, NOT 127.0.0.1)
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# HTTPS Reverse Proxy for Piped API
server {
listen 443 ssl http2;
server_name api.vp.vish.gg;
# SSL Certificates
ssl_certificate /etc/letsencrypt/live/vp.vish.gg/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vp.vish.gg/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Proxy requests to Piped API backend
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# HTTPS Reverse Proxy for Piped Proxy (for video streaming)
server {
listen 443 ssl http2;
server_name proxy.vp.vish.gg;
# SSL Certificates
ssl_certificate /etc/letsencrypt/live/vp.vish.gg/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vp.vish.gg/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Proxy video playback requests through ytproxy
location ~ (/videoplayback|/api/v4/|/api/manifest/) {
include snippets/ytproxy.conf;
add_header Cache-Control private always;
proxy_hide_header Access-Control-Allow-Origin;
}
location / {
include snippets/ytproxy.conf;
add_header Cache-Control "public, max-age=604800";
proxy_hide_header Access-Control-Allow-Origin;
}
}

View File

@@ -0,0 +1,134 @@
# Reactive Resume v4
A free and open-source resume builder.
## Deployment
- **Host:** Calypso (Synology NAS)
- **URL:** https://rxv4access.vishconcord.synology.me
- **Port:** 9751
- **Deployed via:** Portainer Stack
## Services
| Container | Image | Port | Purpose |
|-----------|-------|------|---------|
| Resume-ACCESS | amruthpillai/reactive-resume:latest | 9751:3000 | Main application |
| Resume-DB | postgres:16 | - | PostgreSQL database |
| Resume-MINIO | minio/minio:latest | 9753:9000 | S3-compatible storage |
| Resume-PRINTER | ghcr.io/browserless/chromium:latest | - | PDF generation |
## Data Locations
| Data | Path |
|------|------|
| PostgreSQL | `/volume1/docker/rxv4/db` |
| MinIO/S3 | `/volume1/docker/rxv4/data` |
| Local uploads | `/volume1/docker/rxv4/uploads` |
## Environment Variables
### Required
- `APP_URL` - Public URL (https://rxv4access.vishconcord.synology.me)
- `DATABASE_URL` - PostgreSQL connection string
- `AUTH_SECRET` - JWT secret (generate with `openssl rand -hex 32`)
- `PRINTER_ENDPOINT` - WebSocket URL to printer service
### Email (Gmail SMTP)
- `SMTP_HOST` - smtp.gmail.com
- `SMTP_PORT` - 587
- `SMTP_USER` - your-email@example.com
- `SMTP_PASS` - Gmail app password
### Storage (MinIO)
- `S3_ENDPOINT` - http://minio:9000
- `S3_ACCESS_KEY_ID` - minioadmin
- `S3_SECRET_ACCESS_KEY` - miniopass
- `S3_BUCKET` - default
- `S3_FORCE_PATH_STYLE` - true (required for MinIO)
## Credentials
### MinIO Console
- URL: http://calypso.local:9753
- User: minioadmin
- Password: "REDACTED_PASSWORD"
### PostgreSQL
- Database: resume
- User: resumeuser
- Password: "REDACTED_PASSWORD"
## Updating
```bash
# Via Portainer: Pull and redeploy the stack
# Or manually:
docker compose pull
docker compose up -d
```
## Troubleshooting
### 500 Error / Invalid environment variables
The environment variables changed significantly in v4. Ensure you're using:
- `APP_URL` (not `PUBLIC_URL`)
- `AUTH_SECRET` (not `ACCESS_TOKEN_SECRET`/`REFRESH_TOKEN_SECRET`)
- `PRINTER_ENDPOINT` (not `CHROME_URL`)
- `S3_*` variables (not `STORAGE_*`)
### PDF export not working
Check the printer container:
```bash
docker logs Resume-PRINTER
```
Ensure `PRINTER_ENDPOINT` is set to `ws://printer:3000`
### Database connection issues
Verify the database is healthy:
```bash
docker exec Resume-DB pg_isready -U resumeuser -d resume
```
## AI Integration (Ollama)
Reactive Resume supports AI-assisted features via OpenAI-compatible APIs. Connect to the local Ollama instance on Atlantis.
**Ollama URL:** https://ollama.vishconcord.synology.me
### Setup (per-user in dashboard)
1. Sign in to Reactive Resume
2. Go to **Settings****Artificial Intelligence**
3. Configure:
- **Provider:** OpenAI
- **Base URL:** `https://ollama.vishconcord.synology.me/v1`
- **Model:** `neural-chat:7b` (recommended) or `llama3.2:3b` (faster)
- **API Key:** `ollama` (any text works, Ollama doesn't validate)
### Available Models
| Model | Size | Best For |
|-------|------|----------|
| neural-chat:7b | 7B | General text, recommended |
| llama3.2:3b | 3.2B | Fast responses |
| mistral:7b | 7.2B | High quality |
| phi3:mini | 3.8B | Balanced |
| gemma:2b | 3B | Lightweight |
| codellama:7b | 7B | Code-related |
### AI Features
- Improve resume bullet points
- Generate professional summaries
- Rewrite content for clarity
- Suggest skills and keywords
## Documentation
- [Official Docs](https://docs.rxresu.me/)
- [Self-Hosting Guide](https://docs.rxresu.me/self-hosting/docker)
- [AI Guide](https://docs.rxresu.me/guides/using-ai)
- [GitHub](https://github.com/AmruthPillai/Reactive-Resume)

View File

@@ -0,0 +1,119 @@
# Reactive Resume v4 - Updated for latest version
# Docs: https://docs.rxresu.me/self-hosting/docker
services:
db:
image: postgres:16
container_name: Resume-DB
hostname: resume-db
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD-SHELL", "pg_isready -U resumeuser -d resume"]
timeout: 5s
interval: 10s
retries: 10
volumes:
- /volume1/docker/rxv4/db:/var/lib/postgresql:rw
environment:
POSTGRES_DB: resume
POSTGRES_USER: resumeuser
POSTGRES_PASSWORD: "REDACTED_PASSWORD"
restart: unless-stopped
minio:
image: minio/minio:latest
command: server /data
container_name: Resume-MINIO
hostname: minio
security_opt:
- no-new-privileges:true
user: 1026:100
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 5s
retries: 5
ports:
- 9753:9000
volumes:
- /volume1/docker/rxv4/data:/data:rw
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: "REDACTED_PASSWORD"
restart: unless-stopped
printer:
image: ghcr.io/browserless/chromium:latest
container_name: Resume-PRINTER
hostname: printer
restart: unless-stopped
environment:
HEALTH: "true"
CONCURRENT: "20"
QUEUED: "10"
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://localhost:3000/json/version || exit 1"]
interval: 10s
timeout: 5s
retries: 10
resume:
image: amruthpillai/reactive-resume:latest
container_name: Resume-ACCESS
hostname: resume
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- 9751:3000
volumes:
- /volume1/docker/rxv4/uploads:/app/data:rw
environment:
# --- Server ---
TZ: "America/Chicago"
APP_URL: "https://rxv4access.vishconcord.synology.me"
PRINTER_APP_URL: "http://resume:3000"
# --- Printer ---
PRINTER_ENDPOINT: "ws://printer:3000"
# --- Database ---
DATABASE_URL: "postgresql://resumeuser:REDACTED_PASSWORD@resume-db:5432/resume"
# --- Authentication ---
# Generated with: openssl rand -hex 32
AUTH_SECRET: "d5c3e165dafd2d82bf84acacREDACTED_GITEA_TOKEN"
# --- Email (SMTP) ---
SMTP_HOST: "smtp.gmail.com"
SMTP_PORT: "587"
SMTP_USER: "your-email@example.com"
SMTP_PASS: "REDACTED_PASSWORD"
SMTP_FROM: "Reactive Resume <your-email@example.com>"
SMTP_SECURE: "false"
# --- Storage (S3/MinIO) ---
S3_ACCESS_KEY_ID: "minioadmin"
S3_SECRET_ACCESS_KEY: "miniopass"
S3_REGION: "us-east-1"
S3_ENDPOINT: "http://minio:9000"
S3_BUCKET: "default"
S3_FORCE_PATH_STYLE: "true"
# --- Feature Flags ---
FLAG_DISABLE_SIGNUPS: "false"
FLAG_DISABLE_EMAIL_AUTH: "false"
depends_on:
db:
condition: service_healthy
minio:
condition: service_healthy
printer:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3

View File

@@ -0,0 +1,36 @@
#Docker compose for cloudflare-dns-updater
version: "3.6"
services:
cloudlfare-dns-updater:
image: "spaskifilip/cloudflare-dns-updater:latest"
container_name: "cloudlfare-dns-updater"
volumes:
- app-data:/app # optional unless using the domains.json file and DOMAINS_FILE_PATH variable
environment:
CF_API_TOKEN: "YOUR_API_TOKEN" # Recomended to create a token for the zones, not use the main token
CF_ZONE_ID: "YOUR_ZONE_ID1,YOUR_ZONE_ID2" # Can be only 1 zone ID (usually is)
# Choose the method in which you get your domain records:
# You must choose one method
# DOMAINS_FILE_PATH is not needed if the DOMAINS or DNS_RECORD_COMMENT_KEY variables are set.
# Edit the domains.json according to the example file in the mounted volume.
# If you don't mount a volume, you cannot use the domains.json file and DOMAINS_FILE_PATH variable.
DNS_RECORD_COMMENT_KEY: "Comm1,Comm2" # Any DNS reccord that has any of the comments specified here. Can be 1 comment
#DOMAINS: "domain.com,example1.domain.com,example2.domain.com"
#DOMAINS_FILE_PATH: .\domains.json
SCHEDULE_MINUTES: 5
PROXIED: True # if proxied is set to True, TTL cannot be set/changed
TYPE: A # Supports either A, AAA or CNAME
TTL: 1
# Uncomment the following 3 vars if you want to change the Proxy, TTL and Type (usually it's set once, and no need to change)
#UPDATE_TYPE: True
#UPDATE_PROXY: True
#UPDATE_TTL: True
restart: "unless-stopped"
volumes:
app-data:
driver: local
driver_opts:
o: bind
type: none
device: /volume1/docker/cloudflare-dns-updater