From 3a503cddf944626ce5502ed3eeef59a81ff5cfdd Mon Sep 17 00:00:00 2001 From: ImpulsiveFPS Date: Tue, 3 Feb 2026 10:45:23 +0100 Subject: [PATCH] Initial Homarr dashboard configuration Features: - Homarr 1.0 beta with dark theme matching lemonlink.eu - Dash. system monitoring integration - 60+ pre-configured apps - RSS feeds for homelab, cybersecurity, and tech news - Nginx Proxy Manager ready configuration - Watchtower auto-updates - Gitea repository setup - Automated update script --- .env.example | 92 ++++++++ .gitignore | 42 ++++ DEPLOYMENT.md | 463 +++++++++++++++++++++++++++++++++++++ GITEA_SETUP.md | 328 ++++++++++++++++++++++++++ README.md | 160 +++++++++++++ config/apps.json | 494 ++++++++++++++++++++++++++++++++++++++++ config/board-layouts.md | 241 ++++++++++++++++++++ config/homarr-themes.md | 95 ++++++++ config/rss-feeds.json | 194 ++++++++++++++++ deploy.sh | 110 +++++++++ docker-compose.yml | 88 +++++++ update.sh | 194 ++++++++++++++++ 12 files changed, 2501 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 DEPLOYMENT.md create mode 100644 GITEA_SETUP.md create mode 100644 README.md create mode 100644 config/apps.json create mode 100644 config/board-layouts.md create mode 100644 config/homarr-themes.md create mode 100644 config/rss-feeds.json create mode 100644 deploy.sh create mode 100644 docker-compose.yml create mode 100644 update.sh diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..aa11530 --- /dev/null +++ b/.env.example @@ -0,0 +1,92 @@ +#======================================================================# +# Homarr Environment Configuration # +# Copy this file to .env and customize values # +#======================================================================# + +#------------------------------------------------------------------# +# Repository Info # +#------------------------------------------------------------------# +# Repo: gitea.lemonlink.eu/homelab/homarr-dashboard +# Clone: git clone https://gitea.lemonlink.eu/homelab/homarr-dashboard.git + +#------------------------------------------------------------------# +# Security # +#------------------------------------------------------------------# +# Generate a secure 64-character hex string for encryption +# PowerShell: -join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Maximum 256) }) +# Linux/Mac: openssl rand -hex 32 +SECRET_ENCRYPTION_KEY=4edb53b70d198494e57ce5341aeb1edb384d808df740479aac8985fc36849aeb + +#------------------------------------------------------------------# +# Port Configuration # +#------------------------------------------------------------------# +# Change if ports are already in use +HOMARR_PORT=7575 +DASH_PORT=3001 + +#------------------------------------------------------------------# +# Domain Configuration (for reference) # +#------------------------------------------------------------------# +# Configure these in NPM: +# - dashboard.lemonlink.eu β†’ http://homarr:7575 +# - system.lemonlink.eu β†’ http://dash:3001 +DOMAIN=lemonlink.eu +DASHBOARD_SUBDOMAIN=dashboard +SYSTEM_SUBDOMAIN=system + +#------------------------------------------------------------------# +# Authentication # +#------------------------------------------------------------------# +# Options: credentials, ldap, oidc (can be comma-separated) +AUTH_PROVIDERS=credentials + +#------------------------------------------------------------------# +# OIDC Configuration (Optional) # +# Uncomment and configure if using OIDC/Authelia/Authentik # +#------------------------------------------------------------------# +# AUTH_OIDC_URI=https://auth.lemonlink.eu +# AUTH_OIDC_CLIENT_ID=homarr +# AUTH_OIDC_CLIENT_SECRET=your-client-secret +# AUTH_OIDC_CLIENT_NAME=Homarr + +#------------------------------------------------------------------# +# LDAP Configuration (Optional) # +# Uncomment and configure if using LDAP/Active Directory # +#------------------------------------------------------------------# +# AUTH_LDAP_URI=ldap://ldap.lemonlink.eu:389 +# AUTH_LDAP_BASE=dc=lemonlink,dc=eu +# AUTH_LDAP_BIND_DN=cn=admin,dc=lemonlink,dc=eu +# AUTH_LDAP_BIND_PASSWORD=your-ldap-password + +#------------------------------------------------------------------# +# Dash. Configuration # +#------------------------------------------------------------------# +# Speed test interval in minutes (0 to disable) +DASH_SPEED_TEST_INTERVAL=240 + +#------------------------------------------------------------------# +# Watchtower Configuration # +#------------------------------------------------------------------# +# Check interval in seconds (86400 = 24 hours) +WATCHTOWER_INTERVAL=86400 + +# Optional: Discord/Slack notifications +# WATCHTOWER_NOTIFICATIONS=shoutrrr+discord://token@id + +#------------------------------------------------------------------# +# Database # +#------------------------------------------------------------------# +# SQLite (default) - no additional config needed +DB_URL=/appdata/db/homarr.db + +#------------------------------------------------------------------# +# Logging # +#------------------------------------------------------------------# +LOG_LEVEL=info +NODE_ENV=production + +#------------------------------------------------------------------# +# Analytics (Optional) # +#------------------------------------------------------------------# +# Set to false to disable anonymous analytics +ANALYTICS_ENABLED=true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15439ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +#======================================================================# +# Git Ignore for Homarr Dashboard # +#======================================================================# + +# Environment files (contain secrets) +.env +.env.local +.env.*.local + +# Runtime data +homarr/appdata/ +homarr/data/ +dash/ +*.db +*.db-journal + +# Logs +*.log +logs/ + +# Backups +backups/ + +# OS files +.DS_Store +Thumbs.db +desktop.ini + +# Editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Temporary files +*.tmp +*.temp +.cache/ + +# Docker volumes +volumes/ diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..dc5ef95 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,463 @@ +# πŸš€ Homarr Deployment Guide + +Complete deployment guide for Homarr with system monitoring, RSS feeds, and a sleek dark theme matching lemonlink.eu. + +## πŸ“‹ Table of Contents + +1. [Overview](#overview) +2. [Prerequisites](#prerequisites) +3. [Quick Start](#quick-start) +4. [Configuration](#configuration) +5. [Board Setup](#board-setup) +6. [Public/Private Access](#publicprivate-access) +7. [Troubleshooting](#troubleshooting) + +--- + +## Overview + +This deployment includes: + +| Component | Purpose | +|-----------|---------| +| **Homarr 1.0** | Modern dashboard with drag-and-drop | +| **Dash.** | Real-time system monitoring | +| **Traefik** | Reverse proxy for public access | +| **Watchtower** | Automatic container updates | + +### Features + +- βœ… **5 Pre-configured Boards**: Main, Infrastructure, Media, System, News +- βœ… **60+ Apps**: Pre-configured with icons and categories +- βœ… **System Monitoring**: Full Dash. integration with CPU/RAM/Storage/Network +- βœ… **RSS Feeds**: Homelab, Cybersecurity, and Technology news +- βœ… **Dark Theme**: Matching lemonlink.eu aesthetic +- βœ… **Public/Private Boards**: Granular access control +- βœ… **Docker Integration**: Manage containers from dashboard + +--- + +## Prerequisites + +### System Requirements + +- **OS**: Linux (Ubuntu 20.04+, Debian 11+, etc.) +- **Docker**: 20.10+ with Docker Compose v2 +- **RAM**: 2GB minimum, 4GB recommended +- **Storage**: 5GB free space + +### Install Docker (if not installed) + +```bash +# Ubuntu/Debian +curl -fsSL https://get.docker.com | sh +sudo usermod -aG docker $USER +newgrp docker + +# Verify installation +docker --version +docker compose version +``` + +--- + +## Quick Start + +### 1. Clone or Copy Files + +```bash +cd ~ +# Copy the homarr-deploy folder to your server +cp -r homarr-deploy /opt/ +cd /opt/homarr-deploy +``` + +### 2. Configure Environment + +```bash +# Copy example environment file +cp .env.example .env + +# Edit configuration +nano .env + +# Generate a new encryption key (PowerShell) +# -join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Maximum 256) }) +``` + +### 3. Start Services + +```bash +# Start all services +docker compose up -d + +# Verify services are running +docker compose ps + +# View logs +docker compose logs -f +``` + +### 4. Access Homarr + +- **Homarr Dashboard**: http://your-server-ip:7575 +- **Dash. System Monitor**: http://your-server-ip:3001 +- **Traefik Dashboard**: http://your-server-ip:8080 + +--- + +## Configuration + +### Initial Setup + +1. **First Run**: Navigate to http://your-server-ip:7575 +2. **Onboarding**: Create admin account +3. **Boards**: Create your first board + +### Creating Boards + +#### Board 1: Main Dashboard (Public) + +``` +Navigate to: Manage β†’ Boards β†’ New Board + +Name: Main Dashboard +Visibility: Public +Theme: LemonLink Dark (customize colors) +``` + +**Add Widgets:** +1. **Clock**: Large format, show date +2. **Weather**: Your location +3. **RSS Feed - Homelab**: + - URLs: `https://selfh.st/rss/,https://noted.lol/rss/,https://feeds.fireside.fm/selfhosted/rss` + - Posts limit: 10 +4. **RSS Feed - Cyber**: + - URLs: `https://www.bleepingcomputer.com/feed/,https://feeds.feedburner.com/TheHackersNews,https://krebsonsecurity.com/feed/` + - Posts limit: 10 +5. **RSS Feed - Tech**: + - URLs: `https://news.ycombinator.com/rss,https://techcrunch.com/feed/,https://feeds.arstechnica.com/arstechnica/index` + - Posts limit: 10 + +**Add Apps:** +- Gmail, GitHub, Reddit, YouTube, Discord +- Proxmox, Portainer, Plex, Nextcloud, Vaultwarden + +#### Board 2: Infrastructure (Private) + +``` +Navigate to: Manage β†’ Boards β†’ New Board + +Name: Infrastructure +Visibility: Private +``` + +**Add Widgets:** +1. **iFrame**: Embed Dash. (http://your-server-ip:3001) +2. **System Health Monitor**: Connect to Proxmox +3. **DNS Hole**: Connect to Pi-hole/AdGuard + +**Add Apps:** +- All infrastructure apps (see apps.json) + +#### Board 3: Media Center (Private) + +``` +Name: Media Center +Visibility: Private +``` + +**Add Widgets:** +1. **Media Server**: Connect to Plex/Jellyfin +2. **Torrent**: Connect to qBittorrent/Transmission +3. **Media Requests**: Connect to Overseerr/Jellyseerr + +#### Board 4: System Overview (Private) + +``` +Name: System Overview +Visibility: Private +Layout: Full-width iFrame +``` + +**Add Widget:** +1. **iFrame**: Dash. at http://your-server-ip:3001 (full screen) + +#### Board 5: News Hub (Public) + +``` +Name: News Hub +Visibility: Public +``` + +**Add Widgets:** +1. **RSS Feed - Homelab** (full width) +2. **RSS Feed - Cybersecurity** (full width) +3. **RSS Feed - Technology** (full width) + +--- + +## Public/Private Access + +### Access Control + +| Board | Visibility | Access | +|-------|------------|--------| +| Main Dashboard | Public | Anyone | +| News Hub | Public | Anyone | +| Infrastructure | Private | Logged-in users only | +| Media Center | Private | Logged-in users only | +| System Overview | Private | Logged-in users only | + +### Setting Up External Access (with NPM) + +Since you're using Nginx Proxy Manager (NPM), the setup is straightforward: + +#### Step 1: Ensure NPM Network Exists + +```bash +# Check if network exists +docker network ls | grep npm-network + +# Create if missing +docker network create npm-network +``` + +The `docker-compose.yml` is already configured to connect to the `npm-network`. + +#### Option 1: Cloudflare Tunnel (Recommended) + +```bash +# Install cloudflared +docker run --rm -v /opt/homarr-deploy/cloudflared:/home/nonroot/.cloudflared cloudflare/cloudflared:latest tunnel login + +# Create tunnel +docker run --rm -v /opt/homarr-deploy/cloudflared:/home/nonroot/.cloudflared cloudflare/cloudflared:latest tunnel create homarr + +# Configure tunnel +cat > /opt/homarr-deploy/cloudflared/config.yml << 'EOF' +tunnel: YOUR_TUNNEL_ID +credentials-file: /home/nonroot/.cloudflared/YOUR_TUNNEL_ID.json + +ingress: + - hostname: dashboard.lemonlink.eu + service: http://homarr:7575 + - hostname: system.lemonlink.eu + service: http://dash:3001 + - service: http_status:404 +EOF + +# Run tunnel +docker run -d --name cloudflared \ + -v /opt/homarr-deploy/cloudflared:/home/nonroot/.cloudflared \ + cloudflare/cloudflared:latest tunnel run +``` + +#### Option 2: Nginx Proxy Manager + +Add to your existing NPM: +- **Domain**: `dashboard.lemonlink.eu` +- **Forward Hostname/IP**: `homarr` +- **Forward Port**: `7575` +- **Scheme**: `http` + +#### Option 3: Using Gitea + Webhook (Advanced) + +See [GITEA_SETUP.md](GITEA_SETUP.md) for automated deployment via Gitea webhooks. + +--- + +## Dash. Configuration + +### Environment Variables + +The Dash. container is pre-configured with: + +```yaml +environment: + - DASHDOT_ENABLE_CPU_TEMPS=true + - DASHDOT_ALWAYS_SHOW_PERCENTAGES=true + - DASHDOT_ENABLE_STORAGE_SPLIT_VIEW=true + - DASHDOT_SPEED_TEST_INTERVAL=240 + - DASHDOT_WIDGET_LIST=os,cpu,storage,ram,network +``` + +### Access Dash. + +- **Direct**: http://your-server-ip:3001 +- **Embedded**: Add as iFrame widget in Homarr + +### Customization + +Modify `docker-compose.yml` to change: +- Widget order +- Display options +- Speed test interval + +--- + +## RSS Feed Configuration + +### Pre-configured Feeds + +See `config/rss-feeds.json` for complete list. + +### Adding to Homarr + +1. Edit board β†’ Add Widget β†’ RSS Feed +2. Enter feed URLs (comma-separated) +3. Configure display options: + - Posts limit: 10-20 + - Description line clamp: 2-5 + - Hide description: No + +### Feed Categories + +| Category | Feeds | +|----------|-------| +| Homelab | Selfh.st, Noted, Self-Hosted Podcast, r/SelfHosted | +| Cybersecurity | Bleeping Computer, The Hacker News, Krebs on Security | +| Technology | Hacker News, TechCrunch, Ars Technica, Wired | +| Linux | Phoronix, LWN, OMG! Ubuntu, Arch News | +| Docker | Docker Blog, LinuxServer.io | + +--- + +## Theming + +### Dark Theme (lemonlink.eu Style) + +Navigate to: Board Settings β†’ Appearance + +``` +Primary Color: #6366f1 (Indigo) +Secondary Color: #8b5cf6 (Purple) +Background: #0a0a0f (Near black) +Text Color: #e2e8f0 (Light gray) +Accent Color: #fbbf24 (Amber) +``` + +### Custom CSS + +Add to Board Settings β†’ Custom CSS: + +```css +/* Glassmorphism effect */ +.homarr-card { + background: rgba(255, 255, 255, 0.05) !important; + backdrop-filter: blur(10px) !important; + border: 1px solid rgba(255, 255, 255, 0.1) !important; + border-radius: 16px !important; +} + +/* Hover animation */ +.homarr-card:hover { + transform: translateY(-4px) !important; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3) !important; +} +``` + +--- + +## Maintenance + +### Backup + +```bash +# Backup Homarr data +tar -czf homarr-backup-$(date +%Y%m%d).tar.gz homarr/ + +# Backup configurations +tar -czf config-backup-$(date +%Y%m%d).tar.gz config/ +``` + +### Updates + +Watchtower is configured to auto-update daily. + +Manual update: +```bash +docker compose pull +docker compose up -d +``` + +### Logs + +```bash +# Homarr logs +docker compose logs -f homarr + +# Dash. logs +docker compose logs -f dash + +# All logs +docker compose logs -f +``` + +--- + +## Troubleshooting + +### Issue: Homarr won't start + +```bash +# Check logs +docker compose logs homarr + +# Verify permissions +ls -la homarr/appdata/ + +# Reset permissions +sudo chown -R $USER:$USER homarr/ +``` + +### Issue: Dash. shows no data + +```bash +# Ensure privileged mode is enabled +docker compose stop dash +docker compose rm dash +docker compose up -d dash + +# Check Dash. logs +docker compose logs dash +``` + +### Issue: RSS feeds not loading + +- Check URL is valid and accessible +- Ensure feed is RSS/ATOM/JSON format +- Try accessing feed URL directly in browser + +### Issue: Cannot access from internet + +- Check firewall rules (ports 80, 443, 7575, 3001) +- Verify DNS records point to server +- Check reverse proxy configuration + +--- + +## Security Recommendations + +1. **Use HTTPS**: Enable SSL/TLS with Let's Encrypt +2. **Strong Passwords**: Use password manager for admin account +3. **Firewall**: Restrict port access +4. **VPN**: Consider VPN for private boards +5. **Updates**: Keep containers updated +6. **Backups**: Regular data backups + +--- + +## Resources + +- [Homarr Documentation](https://homarr.dev/docs/) +- [Dash. Documentation](https://getdashdot.com/) +- [Docker Compose Reference](https://docs.docker.com/compose/) + +--- + +## Support + +For issues or questions: +- Homarr Discord: https://discord.gg/homarr +- GitHub Issues: https://github.com/homarr-labs/homarr/issues diff --git a/GITEA_SETUP.md b/GITEA_SETUP.md new file mode 100644 index 0000000..6cec8c7 --- /dev/null +++ b/GITEA_SETUP.md @@ -0,0 +1,328 @@ +# 🦊 Gitea Repository Setup Guide + +This guide will help you set up a Gitea repository for your Homarr dashboard configuration, enabling easy deployment and version-controlled updates. + +## πŸ“‹ Prerequisites + +- Gitea instance running (e.g., `gitea.lemonlink.eu`) +- Git installed on your server +- Docker and Docker Compose installed + +--- + +## πŸš€ Setup Steps + +### 1. Create Repository in Gitea + +1. Navigate to your Gitea instance: `https://gitea.lemonlink.eu` +2. Create a new organization (optional): `homelab` +3. Create new repository: + - **Repository Name**: `homarr-dashboard` + - **Description**: "Homarr dashboard configuration with system monitoring" + - **Visibility**: Private (recommended) + - **Initialize**: Yes, with README + +### 2. Push Configuration to Gitea + +```bash +# On your local machine (where you created the files) +cd homarr-deploy + +# Initialize git repo (if not already done) +git init + +# Add Gitea remote +git remote add origin https://gitea.lemonlink.eu/homelab/homarr-dashboard.git + +# Or if using SSH: +# git remote add origin git@gitea.lemonlink.eu:homelab/homarr-dashboard.git + +# Add all files +git add . + +# Commit +git commit -m "Initial Homarr dashboard configuration + +Features: +- Homarr 1.0 beta with dark theme +- Dash. system monitoring +- 60+ pre-configured apps +- RSS feeds for homelab, cyber, tech news +- Nginx Proxy Manager ready +- Watchtower auto-updates" + +# Push to Gitea +git push -u origin main +``` + +### 3. Deploy on Your Server + +SSH into your server and run: + +```bash +# Create directory +mkdir -p /opt/homelab +cd /opt/homelab + +# Clone repository +git clone https://gitea.lemonlink.eu/homelab/homarr-dashboard.git +# Or with SSH: +# git clone git@gitea.lemonlink.eu:homelab/homarr-dashboard.git + +cd homarr-dashboard + +# Configure environment +cp .env.example .env +nano .env # Edit with your settings + +# Ensure NPM network exists +docker network create npm-network 2>/dev/null || true + +# Deploy +docker compose up -d +``` + +--- + +## πŸ”„ Update Workflow + +### Method 1: Pull Updates on Server + +```bash +cd /opt/homelab/homarr-dashboard +git pull +docker compose up -d +``` + +### Method 2: Using Update Script + +The included `update.sh` script automates this: + +```bash +# Make executable and run +chmod +x update.sh +./update.sh +``` + +### Method 3: Automatic Updates (Webhook) + +Set up a Gitea webhook to auto-deploy on push: + +**In Gitea:** +1. Repository β†’ Settings β†’ Webhooks +2. Add Webhook β†’ Gitea +3. Target URL: `https://deploy.lemonlink.eu/webhook/homarr` +4. Secret: Generate a secure secret +5. Events: Push + +**On Server (optional):** Set up a simple webhook listener or use a CI/CD tool like Drone CI. + +--- + +## πŸ” NPM Configuration + +### Add Proxy Hosts in NPM + +#### 1. Dashboard (Homarr) + +| Setting | Value | +|---------|-------| +| Domain Names | `dashboard.lemonlink.eu` | +| Scheme | `http` | +| Forward Hostname/IP | `homarr` | +| Forward Port | `7575` | +| Cache Assets | βœ… | +| Block Common Exploits | βœ… | + +**SSL Tab:** +- SSL Certificate: Request a new SSL certificate +- Accept Terms: βœ… +- Force SSL: βœ… +- HTTP/2 Support: βœ… +- HSTS Enabled: βœ… + +#### 2. System Monitor (Dash.) + +| Setting | Value | +|---------|-------| +| Domain Names | `system.lemonlink.eu` | +| Scheme | `http` | +| Forward Hostname/IP | `dash` | +| Forward Port | `3001` | + +**SSL Tab:** Same as above + +### Ensure NPM Network Exists + +```bash +# Check if network exists +docker network ls | grep npm-network + +# Create if missing +docker network create npm-network +``` + +--- + +## πŸ“ Repository Structure + +``` +homarr-dashboard/ +β”œβ”€β”€ .git/ # Git repository +β”œβ”€β”€ .env # Environment config (not in git) +β”œβ”€β”€ .env.example # Template for .env +β”œβ”€β”€ docker-compose.yml # Main compose file +β”œβ”€β”€ deploy.sh # Initial deployment script +β”œβ”€β”€ update.sh # Update script +β”œβ”€β”€ README.md # Project readme +β”œβ”€β”€ DEPLOYMENT.md # Full deployment guide +β”œβ”€β”€ GITEA_SETUP.md # This file +└── config/ # Configuration files + β”œβ”€β”€ apps.json + β”œβ”€β”€ rss-feeds.json + β”œβ”€β”€ board-layouts.md + └── homarr-themes.md +``` + +--- + +## πŸ”„ Version Control Best Practices + +### Commit Messages + +```bash +# Good commit messages +git commit -m "Add new RSS feeds for cybersecurity" +git commit -m "Update Docker image to beta.3" +git commit -m "Fix: Correct port mapping for Dash." +git commit -m "Theme: Update primary color to match new design" +``` + +### Branching Strategy + +```bash +# Production branch: main +# Development branch: develop + +# Feature workflow +git checkout -b feature/add-grafana-integration +# ... make changes ... +git commit -am "Add Grafana integration" +git push origin feature/add-grafana-integration +# Create merge request in Gitea +``` + +### Sensitive Data + +**Never commit:** +- `.env` file (contains secrets) +- `homarr/appdata/` (runtime data) +- Any files with passwords or API keys + +**Already configured in `.gitignore`:** +```gitignore +.env +homarr/appdata/ +dash/ +*.log +``` + +--- + +## πŸ› οΈ Advanced: Drone CI Integration + +### `.drone.yml` (optional) + +```yaml +kind: pipeline +type: docker +name: deploy + +steps: + - name: deploy + image: appleboy/drone-ssh + settings: + host: + from_secret: server_host + username: + from_secret: server_user + password: + from_secret: server_password + script: + - cd /opt/homelab/homarr-dashboard + - git pull + - docker compose up -d + + when: + branch: + - main + event: + - push +``` + +--- + +## πŸ“ Maintenance Checklist + +- [ ] Weekly: Review and update RSS feeds +- [ ] Monthly: Update Docker images (`docker compose pull`) +- [ ] Monthly: Backup `homarr/appdata/` directory +- [ ] Quarterly: Review and rotate secrets +- [ ] As needed: Add new apps or integrations + +--- + +## πŸ†˜ Troubleshooting + +### Issue: Cannot clone repository + +```bash +# Test Gitea access +curl -I https://gitea.lemonlink.eu + +# Check SSH key (if using SSH) +cat ~/.ssh/id_rsa.pub +# Add to Gitea: User Settings β†’ SSH Keys +``` + +### Issue: NPM network not found + +```bash +# Create network manually +docker network create npm-network + +# Restart containers +docker compose restart +``` + +### Issue: Changes not reflecting + +```bash +# Force pull and recreate +git fetch origin +git reset --hard origin/main +docker compose up -d --force-recreate +``` + +--- + +## πŸ”— Useful Commands + +```bash +# Check repo status +git status + +# View commit history +git log --oneline -10 + +# Pull latest changes +git pull origin main + +# See what files changed +git diff --name-only + +# Rollback to previous version +git log --oneline # Find commit hash +git checkout +docker compose up -d +``` diff --git a/README.md b/README.md new file mode 100644 index 0000000..5685d78 --- /dev/null +++ b/README.md @@ -0,0 +1,160 @@ +# 🏠 Homarr Ultimate Dashboard Stack + +A complete, production-ready Homarr deployment with system monitoring, RSS feeds, and a sleek dark theme inspired by lemonlink.eu. + +![Dashboard Preview](https://homarr.dev/img/pages/home/page.webp) + +## ✨ Features + +- 🎨 **Dark Theme** - Matching lemonlink.eu aesthetic +- πŸ“Š **System Monitoring** - Full Dash. integration +- πŸ“° **RSS Feeds** - Homelab, Cyber, Tech news +- πŸ” **Public/Private Boards** - Granular access control +- 🐳 **Docker Management** - Manage containers from dashboard +- πŸš€ **Auto-updates** - Watchtower for automatic updates +- 🌐 **NPM Ready** - Pre-configured for Nginx Proxy Manager +- 🦊 **Gitea Repo** - Version controlled deployment + +## πŸ“ Project Structure + +``` +homarr-dashboard/ +β”œβ”€β”€ .git/ # Gitea repository +β”œβ”€β”€ .env # Environment configuration (local only) +β”œβ”€β”€ .env.example # Environment template +β”œβ”€β”€ .gitignore # Git ignore rules +β”œβ”€β”€ docker-compose.yml # Main deployment file +β”œβ”€β”€ deploy.sh # Initial deployment script +β”œβ”€β”€ update.sh # Update from Gitea script +β”œβ”€β”€ README.md # This file +β”œβ”€β”€ DEPLOYMENT.md # Complete deployment guide +β”œβ”€β”€ GITEA_SETUP.md # Gitea repository setup +└── config/ # Configuration files + β”œβ”€β”€ apps.json # 60+ pre-configured apps + β”œβ”€β”€ rss-feeds.json # Curated RSS feeds + β”œβ”€β”€ board-layouts.md # Board layout examples + └── homarr-themes.md # Theme configurations +``` + +## 🦊 Gitea Repository + +**Repo:** `gitea.lemonlink.eu/homelab/homarr-dashboard` + +### Quick Deploy (Initial) + +```bash +# On your server +mkdir -p /opt/homelab +cd /opt/homelab + +# Clone from Gitea +git clone https://gitea.lemonlink.eu/homelab/homarr-dashboard.git +cd homarr-dashboard + +# Configure +cp .env.example .env +nano .env # Edit settings + +# Ensure NPM network exists +docker network create npm-network 2>/dev/null || true + +# Deploy +chmod +x deploy.sh +./deploy.sh +``` + +### Quick Update + +```bash +cd /opt/homelab/homarr-dashboard +./update.sh +``` + +## πŸš€ Quick Start (Without Git) + +```bash +# 1. Copy to your server +cp -r homarr-deploy /opt/ +cd /opt/homarr-deploy + +# 2. Configure environment +cp .env.example .env +# Edit .env with your settings + +# 3. Ensure NPM network exists +docker network create npm-network 2>/dev/null || true + +# 4. Start services +docker compose up -d + +# 5. Access dashboard +# http://your-server-ip:7575 +``` + +## πŸ“‹ What's Included + +### Dashboards + +| Board | Purpose | Visibility | +|-------|---------|------------| +| **Main Dashboard** | Quick links & news | Public | +| **Infrastructure** | Server management | Private | +| **Media Center** | Media server control | Private | +| **System Overview** | Full monitoring | Private | +| **News Hub** | RSS aggregation | Public | + +### Widgets + +- ⏰ **Clock** - Date and time +- 🌀️ **Weather** - Current conditions +- πŸ“° **RSS Feed** - Multiple news sources +- πŸ“Š **System Health** - Proxmox integration +- πŸ“ˆ **Dash. iFrame** - Full system monitoring +- πŸ–₯️ **Media Server** - Active sessions +- ⬇️ **Torrent/Usenet** - Download progress + +### Apps (60+) + +- 🏠 **Infrastructure**: Proxmox, Portainer, TrueNAS, Pi-hole, NPM +- πŸ“Š **Monitoring**: Grafana, Prometheus, Uptime Kuma, Netdata +- 🎬 **Media**: Plex, Jellyfin, Sonarr, Radarr, *arr stack +- πŸ“ **Productivity**: Nextcloud, Immich, Vaultwarden +- πŸ’» **Development**: GitLab, Jenkins, Registry +- 🏠 **Smart Home**: Home Assistant, Node-RED +- 🌐 **External**: Gmail, GitHub, Reddit, YouTube + +## 🌐 NPM Configuration + +Add these Proxy Hosts in Nginx Proxy Manager: + +### Dashboard (Homarr) +| Setting | Value | +|---------|-------| +| Domain Names | `dashboard.lemonlink.eu` | +| Forward Hostname/IP | `homarr` | +| Forward Port | `7575` | + +### System Monitor (Dash.) +| Setting | Value | +|---------|-------| +| Domain Names | `system.lemonlink.eu` | +| Forward Hostname/IP | `dash` | +| Forward Port | `3001` | + +Enable SSL for both with Let's Encrypt. + +## πŸ“– Documentation + +- **[DEPLOYMENT.md](DEPLOYMENT.md)** - Complete deployment guide +- **[GITEA_SETUP.md](GITEA_SETUP.md)** - Gitea repository setup & webhooks +- **[config/board-layouts.md](config/board-layouts.md)** - Board layout examples + +## πŸ”— Useful Links + +- [Homarr](https://homarr.dev/) - Dashboard documentation +- [Dash.](https://getdashdot.com/) - System monitoring +- [lemonlink.eu](https://lemonlink.eu) - Your awesome website! + +## πŸ“„ License + +MIT - Free to use and modify! diff --git a/config/apps.json b/config/apps.json new file mode 100644 index 0000000..c1ec43e --- /dev/null +++ b/config/apps.json @@ -0,0 +1,494 @@ +{ + "description": "Pre-configured apps for Homarr dashboard", + "categories": { + "infrastructure": { + "title": "🏠 Infrastructure", + "apps": [ + { + "name": "Proxmox", + "icon": "proxmox", + "url": "https://proxmox.lemonlink.eu", + "description": "Virtualization Platform", + "integration": "proxmox" + }, + { + "name": "Portainer", + "icon": "portainer", + "url": "https://portainer.lemonlink.eu", + "description": "Docker Management", + "integration": "docker" + }, + { + "name": "TrueNAS", + "icon": "truenas", + "url": "https://truenas.lemonlink.eu", + "description": "Storage Management" + }, + { + "name": "Pi-hole", + "icon": "pihole", + "url": "https://pihole.lemonlink.eu/admin", + "description": "DNS Sinkhole", + "integration": "pihole" + }, + { + "name": "AdGuard", + "icon": "adguard", + "url": "https://adguard.lemonlink.eu", + "description": "Ad Blocking", + "integration": "adguard" + }, + { + "name": "Nginx Proxy Manager", + "icon": "nginx-proxy-manager", + "url": "https://npm.lemonlink.eu", + "description": "Reverse Proxy" + }, + { + "name": "Traefik", + "icon": "traefik", + "url": "https://traefik.lemonlink.eu", + "description": "Edge Router" + }, + { + "name": "UniFi", + "icon": "ubiquiti", + "url": "https://unifi.lemonlink.eu", + "description": "Network Management" + }, + { + "name": "OPNsense", + "icon": "opnsense", + "url": "https://opnsense.lemonlink.eu", + "description": "Firewall" + }, + { + "name": "pfSense", + "icon": "pfsense", + "url": "https://pfsense.lemonlink.eu", + "description": "Firewall/Router" + }, + { + "name": "Tailscale", + "icon": "tailscale", + "url": "https://login.tailscale.com/admin", + "description": "VPN Mesh" + }, + { + "name": "WireGuard", + "icon": "wireguard", + "url": "https://wg.lemonlink.eu", + "description": "VPN Server" + }, + { + "name": "OpenVPN", + "icon": "openvpn", + "url": "https://openvpn.lemonlink.eu", + "description": "VPN Server" + } + ] + }, + "monitoring": { + "title": "πŸ“Š Monitoring", + "apps": [ + { + "name": "Grafana", + "icon": "grafana", + "url": "https://grafana.lemonlink.eu", + "description": "Metrics Dashboard" + }, + { + "name": "Prometheus", + "icon": "prometheus", + "url": "https://prometheus.lemonlink.eu", + "description": "Metrics Collection" + }, + { + "name": "Uptime Kuma", + "icon": "uptime-kuma", + "url": "https://uptime.lemonlink.eu", + "description": "Uptime Monitor" + }, + { + "name": "Netdata", + "icon": "netdata", + "url": "https://netdata.lemonlink.eu", + "description": "Real-time Monitoring" + }, + { + "name": "Dash.", + "icon": "dashdot", + "url": "http://localhost:3001", + "description": "System Overview", + "integration": "dashdot" + }, + { + "name": "Beszel", + "icon": "beszel", + "url": "https://beszel.lemonlink.eu", + "description": "Server Monitoring" + }, + { + "name": "Scrutiny", + "icon": "scrutiny", + "url": "https://scrutiny.lemonlink.eu", + "description": "SMART Monitoring" + } + ] + }, + "media": { + "title": "🎬 Media", + "apps": [ + { + "name": "Plex", + "icon": "plex", + "url": "https://plex.lemonlink.eu", + "description": "Media Server", + "integration": "plex" + }, + { + "name": "Jellyfin", + "icon": "jellyfin", + "url": "https://jellyfin.lemonlink.eu", + "description": "Media Server", + "integration": "jellyfin" + }, + { + "name": "Emby", + "icon": "emby", + "url": "https://emby.lemonlink.eu", + "description": "Media Server", + "integration": "emby" + }, + { + "name": "Sonarr", + "icon": "sonarr", + "url": "https://sonarr.lemonlink.eu", + "description": "TV Shows", + "integration": "sonarr" + }, + { + "name": "Radarr", + "icon": "radarr", + "url": "https://radarr.lemonlink.eu", + "description": "Movies", + "integration": "radarr" + }, + { + "name": "Lidarr", + "icon": "lidarr", + "url": "https://lidarr.lemonlink.eu", + "description": "Music", + "integration": "lidarr" + }, + { + "name": "Readarr", + "icon": "readarr", + "url": "https://readarr.lemonlink.eu", + "description": "Books", + "integration": "readarr" + }, + { + "name": "Bazarr", + "icon": "bazarr", + "url": "https://bazarr.lemonlink.eu", + "description": "Subtitles", + "integration": "bazarr" + }, + { + "name": "Prowlarr", + "icon": "prowlarr", + "url": "https://prowlarr.lemonlink.eu", + "description": "Indexer Manager", + "integration": "prowlarr" + }, + { + "name": "Overseerr", + "icon": "overseerr", + "url": "https://overseerr.lemonlink.eu", + "description": "Media Requests", + "integration": "overseerr" + }, + { + "name": "Jellyseerr", + "icon": "jellyseerr", + "url": "https://jellyseerr.lemonlink.eu", + "description": "Media Requests", + "integration": "jellyseerr" + }, + { + "name": "Transmission", + "icon": "transmission", + "url": "https://transmission.lemonlink.eu", + "description": "BitTorrent", + "integration": "transmission" + }, + { + "name": "qBittorrent", + "icon": "qbittorrent", + "url": "https://qbittorrent.lemonlink.eu", + "description": "BitTorrent", + "integration": "qbittorrent" + }, + { + "name": "Deluge", + "icon": "deluge", + "url": "https://deluge.lemonlink.eu", + "description": "BitTorrent", + "integration": "deluge" + }, + { + "name": "SABnzbd", + "icon": "sabnzbd", + "url": "https://sabnzbd.lemonlink.eu", + "description": "Usenet", + "integration": "sabnzbd" + }, + { + "name": "NZBGet", + "icon": "nzbget", + "url": "https://nzbget.lemonlink.eu", + "description": "Usenet", + "integration": "nzbget" + }, + { + "name": "Tdarr", + "icon": "tdarr", + "url": "https://tdarr.lemonlink.eu", + "description": "Transcoding" + } + ] + }, + "productivity": { + "title": "πŸ“ Productivity", + "apps": [ + { + "name": "Nextcloud", + "icon": "nextcloud", + "url": "https://cloud.lemonlink.eu", + "description": "Cloud Storage" + }, + { + "name": "Immich", + "icon": "immich", + "url": "https://photos.lemonlink.eu", + "description": "Photo Backup" + }, + { + "name": "Paperless", + "icon": "paperless", + "url": "https://paperless.lemonlink.eu", + "description": "Document Management" + }, + { + "name": "Vaultwarden", + "icon": "vaultwarden", + "url": "https://vault.lemonlink.eu", + "description": "Password Manager" + }, + { + "name": "Bookstack", + "icon": "bookstack", + "url": "https://wiki.lemonlink.eu", + "description": "Documentation" + }, + { + "name": "Miniflux", + "icon": "miniflux", + "url": "https://rss.lemonlink.eu", + "description": "RSS Reader" + }, + { + "name": "FreshRSS", + "icon": "freshrss", + "url": "https://freshrss.lemonlink.eu", + "description": "RSS Reader" + }, + { + "name": "Joplin", + "icon": "joplin", + "url": "https://joplin.lemonlink.eu", + "description": "Note Taking" + } + ] + }, + "development": { + "title": "πŸ’» Development", + "apps": [ + { + "name": "GitLab", + "icon": "gitlab", + "url": "https://git.lemonlink.eu", + "description": "Git Repository" + }, + { + "name": "Gitea", + "icon": "gitea", + "url": "https://gitea.lemonlink.eu", + "description": "Git Repository" + }, + { + "name": "Jenkins", + "icon": "jenkins", + "url": "https://jenkins.lemonlink.eu", + "description": "CI/CD" + }, + { + "name": "Drone CI", + "icon": "drone", + "url": "https://drone.lemonlink.eu", + "description": "CI/CD" + }, + { + "name": "Nexus", + "icon": "sonatype", + "url": "https://nexus.lemonlink.eu", + "description": "Artifact Repository" + }, + { + "name": "Registry", + "icon": "docker", + "url": "https://registry.lemonlink.eu", + "description": "Docker Registry" + }, + { + "name": "Codeserver", + "icon": "vscode", + "url": "https://code.lemonlink.eu", + "description": "VS Code Server" + } + ] + }, + "smartHome": { + "title": "🏠 Smart Home", + "apps": [ + { + "name": "Home Assistant", + "icon": "home-assistant", + "url": "https://homeassistant.lemonlink.eu", + "description": "Smart Home Hub", + "integration": "homeassistant" + }, + { + "name": "Node-RED", + "icon": "nodered", + "url": "https://nodered.lemonlink.eu", + "description": "Automation" + }, + { + "name": "ESPHome", + "icon": "esphome", + "url": "https://esphome.lemonlink.eu", + "description": "ESP Devices" + }, + { + "name": "Zigbee2MQTT", + "icon": "zigbee", + "url": "https://z2m.lemonlink.eu", + "description": "Zigbee Bridge" + }, + { + "name": "Scrypted", + "icon": "scrypted", + "url": "https://scrypted.lemonlink.eu", + "description": "Video Integration" + } + ] + }, + "external": { + "title": "🌐 External Services", + "apps": [ + { + "name": "Gmail", + "icon": "gmail", + "url": "https://mail.google.com", + "description": "Email" + }, + { + "name": "Google Drive", + "icon": "google-drive", + "url": "https://drive.google.com", + "description": "Cloud Storage" + }, + { + "name": "GitHub", + "icon": "github", + "url": "https://github.com", + "description": "Code Repository" + }, + { + "name": "Reddit", + "icon": "reddit", + "url": "https://reddit.com", + "description": "Social News" + }, + { + "name": "YouTube", + "icon": "youtube", + "url": "https://youtube.com", + "description": "Video Platform" + }, + { + "name": "Twitter/X", + "icon": "twitter", + "url": "https://twitter.com", + "description": "Social Media" + }, + { + "name": "Discord", + "icon": "discord", + "url": "https://discord.com", + "description": "Chat" + }, + { + "name": "LinkedIn", + "icon": "linkedin", + "url": "https://linkedin.com", + "description": "Professional Network" + }, + { + "name": "ProtonMail", + "icon": "protonmail", + "url": "https://mail.proton.me", + "description": "Secure Email" + }, + { + "name": "Tutanota", + "icon": "tutanota", + "url": "https://mail.tutanota.com", + "description": "Secure Email" + }, + { + "name": "Mastodon", + "icon": "mastodon", + "url": "https://mastodon.social", + "description": "Fediverse" + }, + { + "name": "Netflix", + "icon": "netflix", + "url": "https://netflix.com", + "description": "Streaming" + }, + { + "name": "Spotify", + "icon": "spotify", + "url": "https://open.spotify.com", + "description": "Music" + }, + { + "name": "Amazon", + "icon": "amazon", + "url": "https://amazon.com", + "description": "Shopping" + }, + { + "name": "Cloudflare", + "icon": "cloudflare", + "url": "https://dash.cloudflare.com", + "description": "DNS/CDN" + } + ] + } + } +} diff --git a/config/board-layouts.md b/config/board-layouts.md new file mode 100644 index 0000000..d9ecb64 --- /dev/null +++ b/config/board-layouts.md @@ -0,0 +1,241 @@ +# Homarr Board Layouts + +## Board 1: 🏠 Main Dashboard (Public) +**Purpose**: Quick overview and commonly used links +**Visibility**: Public (no login required) + +### Layout Structure +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ [CLOCK & WEATHER] [SEARCH BAR] [SYSTEM STATUS OVERVIEW] β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ“° NEWS & UPDATES β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Homelab RSS β”‚ β”‚ Cyber RSS β”‚ β”‚ Tech RSS β”‚ β”‚ +β”‚ β”‚ [Widget] β”‚ β”‚ [Widget] β”‚ β”‚ [Widget] β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ”— QUICK LINKS β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Gmail β”‚ β”‚ GitHub β”‚ β”‚ Reddit β”‚ β”‚ YouTube β”‚ β”‚ Discord β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ 🏠 INFRASTRUCTURE QUICK ACCESS β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚Proxmox β”‚ β”‚Portainerβ”‚ β”‚ Plex β”‚ β”‚Nextcloudβ”‚ β”‚ Vault β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Widgets +1. **Clock** - Large, centered, with date +2. **Weather** - Current location weather +3. **RSS Feeds** - 3 separate widgets (Homelab, Cyber, Tech) +4. **System Health Monitor** - Quick status from Dash. +5. **Bookmarks** - External services + +### Apps +- Gmail, GitHub, Reddit, YouTube, Discord +- Proxmox, Portainer, Plex, Nextcloud, Vaultwarden +- Tailscale, Cloudflare + +--- + +## Board 2: πŸ”§ Infrastructure (Private) +**Purpose**: Complete infrastructure management +**Visibility**: Private (requires login) + +### Layout Structure +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ INFRASTRUCTURE MANAGEMENT [USER MENU] β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ“Š SYSTEM MONITORING (Full Dash. iFrame) β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ [Dash. WIDGET - Full Width] β”‚ β”‚ +β”‚ β”‚ CPU | RAM | STORAGE | NETWORK β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ–§ NETWORK & VIRTUALIZATION β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚Proxmox β”‚ β”‚ UniFi β”‚ β”‚OPNsense β”‚ β”‚Pi-hole β”‚ β”‚AdGuard β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚Traefik β”‚ β”‚ NPM β”‚ β”‚WireGuardβ”‚ β”‚Tailscaleβ”‚ β”‚ VPN β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ’Ύ STORAGE & BACKUP β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚TrueNAS β”‚ β”‚Portainerβ”‚ β”‚ MinIO β”‚ β”‚Syncthingβ”‚ β”‚ +β”‚ β”‚ SCALE β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ“ˆ MONITORING STACK β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Grafana β”‚ β”‚Prometheusβ”‚ β”‚Uptime β”‚ β”‚ Netdata β”‚ β”‚ Beszel β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Kuma β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Widgets +1. **Dash. iFrame** - Full system monitoring +2. **DNS Hole** - Pi-hole/AdGuard stats +3. **System Health Monitor** - Proxmox integration + +### Apps +All infrastructure-related apps from the apps.json configuration. + +--- + +## Board 3: 🎬 Media Center (Private) +**Purpose**: Media server management +**Visibility**: Private (requires login) + +### Layout Structure +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ MEDIA CENTER [USER MENU] β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ“Ί MEDIA SERVERS β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Plex β”‚ β”‚Jellyfin β”‚ β”‚ Emby β”‚ β”‚ +β”‚ β”‚[Widget] β”‚ β”‚[Widget] β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ 🎬 ARR STACK β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Sonarr β”‚ β”‚ Radarr β”‚ β”‚ Lidarr β”‚ β”‚Readarr β”‚ β”‚ Bazarr β”‚ β”‚ +β”‚ β”‚ TV β”‚ β”‚ Movies β”‚ β”‚ Music β”‚ β”‚ Books β”‚ β”‚Subtitlesβ”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚Prowlarr β”‚ β”‚Overseerrβ”‚ β”‚Jellyseerβ”‚ β”‚ +β”‚ β”‚ Indexersβ”‚ β”‚ Requestsβ”‚ β”‚ Requestsβ”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ ⬇️ DOWNLOAD CLIENTS β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ qBittor-β”‚ β”‚Transsmisβ”‚ β”‚ Deluge β”‚ β”‚ SABnzbd β”‚ β”‚ NZBGet β”‚ β”‚ +β”‚ β”‚ rent β”‚ β”‚ sion β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚[Widget] β”‚ β”‚[Widget] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Widgets +1. **Media Server** - Active sessions from Plex/Jellyfin +2. **Torrent** - Download progress +3. **Usenet** - Download progress +4. **Media Requests** - Overseerr/Jellyseerr integration + +--- + +## Board 4: πŸ“Š System Overview (Private) +**Purpose**: Comprehensive system monitoring +**Visibility**: Private (requires login) + +### Layout Structure +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ SYSTEM OVERVIEW [USER MENU] β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ [FULL SCREEN Dash. IFRAME] β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ CPU USAGE RAM USAGE STORAGE USAGE β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ 45% β”‚ β”‚ 62% β”‚ β”‚ 78% β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ NETWORK SPEED GRAPH β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ [Real-time upload/download] β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ DETAILED SYSTEM INFO β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ OS: Ubuntu 22.04 Uptime: 45 days β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ CPU: Intel Xeon Cores: 24 β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ RAM: 96GB DDR4 Storage: 12TB β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## Board 5: πŸ“° News Hub (Public) +**Purpose**: RSS feed aggregation +**Visibility**: Public (no login required) + +### Layout Structure +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ NEWS HUB [SEARCH] β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ 🏠 HOMELAB NEWS β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ [RSS Widget - Selfh.st, Noted, Self-Hosted Podcast] β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β€’ New Docker container release... [2h ago] β”‚ β”‚ +β”‚ β”‚ β€’ How to setup Authelia with... [5h ago] β”‚ β”‚ +β”‚ β”‚ β€’ Top 10 self-hosted apps for... [1d ago] β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ”’ CYBERSECURITY NEWS β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ [RSS Widget - Bleeping Computer, Hacker News, Krebs] β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β€’ Critical vulnerability found in... [30m ago] β”‚ β”‚ +β”‚ β”‚ β€’ New ransomware campaign targets... [3h ago] β”‚ β”‚ +β”‚ β”‚ β€’ Security patch released for... [6h ago] β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ’» TECHNOLOGY NEWS β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ [RSS Widget - Hacker News, TechCrunch, Ars Technica] β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β€’ New AI model released by... [1h ago] β”‚ β”‚ +β”‚ β”‚ β€’ Tech company announces... [4h ago] β”‚ β”‚ +β”‚ β”‚ β€’ Open source project reaches... [12h ago] β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` diff --git a/config/homarr-themes.md b/config/homarr-themes.md new file mode 100644 index 0000000..0f28000 --- /dev/null +++ b/config/homarr-themes.md @@ -0,0 +1,95 @@ +# Homarr Themes Configuration + +## Dark Theme (Matching lemonlink.eu aesthetic) + +### Primary Board Theme (Public) +```json +{ + "name": "LemonLink Dark", + "primaryColor": "#6366f1", + "secondaryColor": "#8b5cf6", + "background": "#0a0a0f", + "backgroundGradient": "linear-gradient(135deg, #0a0a0f 0%, #1a1a2e 100%)", + "cardBackground": "rgba(255, 255, 255, 0.05)", + "cardBorder": "rgba(255, 255, 255, 0.1)", + "textColor": "#e2e8f0", + "textMuted": "#94a3b8", + "accentColor": "#fbbf24", + "successColor": "#22c55e", + "warningColor": "#f59e0b", + "errorColor": "#ef4444", + "infoColor": "#3b82f6", + "glassEffect": true, + "transparency": 0.8, + "borderRadius": 16, + "shadowIntensity": "high" +} +``` + +### Secondary Board Theme (Private/Admin) +```json +{ + "name": "LemonLink Deep", + "primaryColor": "#06b6d4", + "secondaryColor": "#3b82f6", + "background": "#0f172a", + "backgroundGradient": "linear-gradient(135deg, #0f172a 0%, #1e293b 100%)", + "cardBackground": "rgba(15, 23, 42, 0.8)", + "cardBorder": "rgba(6, 182, 212, 0.2)", + "textColor": "#f1f5f9", + "textMuted": "#64748b", + "accentColor": "#22d3ee", + "glassEffect": true, + "transparency": 0.9, + "borderRadius": 12 +} +``` + +## Custom CSS for Advanced Styling + +```css +/* Glassmorphism Cards */ +.homarr-card { + background: rgba(255, 255, 255, 0.05) !important; + backdrop-filter: blur(10px) !important; + border: 1px solid rgba(255, 255, 255, 0.1) !important; + border-radius: 16px !important; + transition: all 0.3s ease !important; +} + +.homarr-card:hover { + transform: translateY(-4px) !important; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3) !important; + border-color: rgba(99, 102, 241, 0.3) !important; +} + +/* Animated Gradient Background */ +.dashboard-background { + background: linear-gradient(-45deg, #0a0a0f, #1a1a2e, #0f172a, #1e1b4b); + background-size: 400% 400%; + animation: gradient 15s ease infinite; +} + +@keyframes gradient { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +/* Glowing Text Effect */ +.glow-text { + text-shadow: 0 0 20px rgba(99, 102, 241, 0.5); +} + +/* Custom Scrollbar */ +::-webkit-scrollbar { + width: 8px; +} +::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.2); +} +::-webkit-scrollbar-thumb { + background: rgba(99, 102, 241, 0.5); + border-radius: 4px; +} +``` diff --git a/config/rss-feeds.json b/config/rss-feeds.json new file mode 100644 index 0000000..da5f526 --- /dev/null +++ b/config/rss-feeds.json @@ -0,0 +1,194 @@ +{ + "description": "Curated RSS feeds for Homarr dashboard", + "categories": { + "homelab": { + "title": "Homelab & Self-Hosted", + "feeds": [ + { + "name": "Selfh.st", + "url": "https://selfh.st/rss/", + "description": "Self-hosted software directory and news" + }, + { + "name": "Noted", + "url": "https://noted.lol/rss/", + "description": "Self-hosting guides and tutorials" + }, + { + "name": "Techno Tim", + "url": "https://www.youtube.com/feeds/videos.xml?channel_id=UCOk-gHyjcWZNj3Br4oxwh0A", + "description": "Homelab tutorials and projects" + }, + { + "name": "Self-Hosted Podcast", + "url": "https://feeds.fireside.fm/selfhosted/rss", + "description": "Jupiter Broadcasting homelab podcast" + }, + { + "name": "r/SelfHosted", + "url": "https://www.reddit.com/r/selfhosted.rss", + "description": "Self-hosted community discussions" + }, + { + "name": "Awesome Selfhosted", + "url": "https://github.com/awesome-selfhosted/awesome-selfhosted/releases.atom", + "description": "Awesome self-hosted software list updates" + } + ] + }, + "cybersecurity": { + "title": "Cybersecurity", + "feeds": [ + { + "name": "Bleeping Computer", + "url": "https://www.bleepingcomputer.com/feed/", + "description": "Cybersecurity news and alerts" + }, + { + "name": "The Hacker News", + "url": "https://feeds.feedburner.com/TheHackersNews", + "description": "Cybersecurity and hacking news" + }, + { + "name": "Krebs on Security", + "url": "https://krebsonsecurity.com/feed/", + "description": "Brian Krebs security blog" + }, + { + "name": "Dark Reading", + "url": "https://www.darkreading.com/rss.xml", + "description": "Enterprise security news" + }, + { + "name": "Schneier on Security", + "url": "https://www.schneier.com/feed/atom/", + "description": "Bruce Schneier security blog" + }, + { + "name": "NIST NVD", + "url": "https://nvd.nist.gov/feeds/xml/cve/misc/nvd-rss.xml", + "description": "Latest CVE vulnerabilities" + } + ] + }, + "technology": { + "title": "Technology & Dev", + "feeds": [ + { + "name": "Hacker News", + "url": "https://news.ycombinator.com/rss", + "description": "Tech news and discussions" + }, + { + "name": "TechCrunch", + "url": "https://techcrunch.com/feed/", + "description": "Startup and technology news" + }, + { + "name": "Ars Technica", + "url": "https://feeds.arstechnica.com/arstechnica/index", + "description": "Technology news and reviews" + }, + { + "name": "Wired", + "url": "https://www.wired.com/feed/rss", + "description": "Technology and culture" + }, + { + "name": "The Verge", + "url": "https://www.theverge.com/rss/index.xml", + "description": "Technology and consumer electronics" + }, + { + "name": "GitHub Trending", + "url": "https://github.com/trending/feed", + "description": "Trending repositories" + }, + { + "name": "Dev.to", + "url": "https://dev.to/feed", + "description": "Developer community articles" + } + ] + }, + "linux": { + "title": "Linux & Open Source", + "feeds": [ + { + "name": "Phoronix", + "url": "https://www.phoronix.com/rss.php", + "description": "Linux hardware and benchmarking" + }, + { + "name": "LWN.net", + "url": "https://lwn.net/headlines/rss", + "description": "Linux weekly news" + }, + { + "name": "OMG! Ubuntu", + "url": "https://www.omgubuntu.co.uk/feed", + "description": "Ubuntu and Linux news" + }, + { + "name": "Arch Linux News", + "url": "https://archlinux.org/feeds/news/", + "description": "Arch Linux announcements" + }, + { + "name": "Proxmox Blog", + "url": "https://www.proxmox.com/en/news/rss", + "description": "Proxmox virtualization news" + } + ] + }, + "docker": { + "title": "Docker & Containers", + "feeds": [ + { + "name": "Docker Blog", + "url": "https://www.docker.com/feed/", + "description": "Official Docker blog" + }, + { + "name": "LinuxServer.io", + "url": "https://blog.linuxserver.io/rss/", + "description": "Container images and guides" + }, + { + "name": "Kubernetes Blog", + "url": "https://kubernetes.io/feed.xml", + "description": "Kubernetes official blog" + } + ] + } + }, + "widgetConfig": { + "homelabRss": { + "feedUrls": [ + "https://selfh.st/rss/", + "https://noted.lol/rss/", + "https://feeds.fireside.fm/selfhosted/rss" + ], + "postsLimit": 20, + "descriptionLineClamp": 3 + }, + "cyberRss": { + "feedUrls": [ + "https://www.bleepingcomputer.com/feed/", + "https://feeds.feedburner.com/TheHackersNews", + "https://krebsonsecurity.com/feed/" + ], + "postsLimit": 20, + "descriptionLineClamp": 2 + }, + "techRss": { + "feedUrls": [ + "https://news.ycombinator.com/rss", + "https://techcrunch.com/feed/", + "https://feeds.arstechnica.com/arstechnica/index" + ], + "postsLimit": 20, + "descriptionLineClamp": 3 + } + } +} diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..7b0913c --- /dev/null +++ b/deploy.sh @@ -0,0 +1,110 @@ +#!/bin/bash +#======================================================================# +# Homarr Quick Deployment Script # +#======================================================================# + +set -e + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE} Homarr Dashboard Deployment Script ${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +# Check if running as root +if [ "$EUID" -eq 0 ]; then + echo -e "${YELLOW}⚠️ Warning: Running as root. Continuing...${NC}" +fi + +# Check Docker +if ! command -v docker &> /dev/null; then + echo -e "${RED}❌ Docker is not installed!${NC}" + echo "Install Docker first: https://docs.docker.com/get-docker/" + exit 1 +fi + +if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then + echo -e "${RED}❌ Docker Compose is not installed!${NC}" + exit 1 +fi + +echo -e "${GREEN}βœ… Docker is installed${NC}" + +# Generate encryption key +echo "" +echo -e "${BLUE}πŸ” Generating encryption key...${NC}" +if command -v openssl &> /dev/null; then + ENCRYPTION_KEY=$(openssl rand -hex 32) +else + ENCRYPTION_KEY=$(head -c 32 /dev/urandom | xxd -p | tr -d '\n') +fi +echo -e "${GREEN}βœ… Encryption key generated${NC}" + +# Setup environment file +if [ ! -f .env ]; then + echo "" + echo -e "${BLUE}πŸ“„ Creating .env file...${NC}" + cp .env.example .env + sed -i "s/SECRET_ENCRYPTION_KEY=.*/SECRET_ENCRYPTION_KEY=$ENCRYPTION_KEY/" .env + echo -e "${GREEN}βœ… .env file created${NC}" + echo -e "${YELLOW}⚠️ Please edit .env with your domain and settings${NC}" +else + echo -e "${YELLOW}⚠️ .env file already exists, skipping...${NC}" +fi + +# Create directories +echo "" +echo -e "${BLUE}πŸ“ Creating directories...${NC}" +mkdir -p homarr/appdata dash traefik/letsencrypt +echo -e "${GREEN}βœ… Directories created${NC}" + +# Start services +echo "" +echo -e "${BLUE}πŸš€ Starting services...${NC}" +if docker compose version &> /dev/null; then + docker compose up -d +else + docker-compose up -d +fi +echo -e "${GREEN}βœ… Services started${NC}" + +# Wait for services +echo "" +echo -e "${BLUE}⏳ Waiting for services to be ready...${NC}" +sleep 5 + +# Check status +echo "" +echo -e "${BLUE}πŸ“Š Service Status:${NC}" +if docker compose version &> /dev/null; then + docker compose ps +else + docker-compose ps +fi + +# Get IP +IP=$(hostname -I | awk '{print $1}') + +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN} πŸŽ‰ Deployment Complete! ${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "Access your dashboard at:" +echo -e " ${BLUE}β€’ Homarr:${NC} http://$IP:7575" +echo -e " ${BLUE}β€’ Dash.:${NC} http://$IP:3001" +echo -e " ${BLUE}β€’ Traefik:${NC} http://$IP:8080" +echo "" +echo -e "${YELLOW}Next Steps:${NC}" +echo -e " 1. Complete the onboarding at http://$IP:7575" +echo -e " 2. Create your first board" +echo -e " 3. Configure your apps and widgets" +echo -e " 4. See DEPLOYMENT.md for detailed configuration" +echo "" +echo -e "${GREEN}Happy Homelabbing! 🏠${NC}" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7a6a04b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,88 @@ +#======================================================================# +# Homarr + Dash. - Ultimate Homelab Dashboard Stack # +# Designed for Nginx Proxy Manager (NPM) # +# Repo: gitea.lemonlink.eu/homelab/homarr-dashboard # +#======================================================================# + +services: + #------------------------------------------------------------------# + # Homarr 1.0 - Modern Dashboard # + #------------------------------------------------------------------# + homarr: + container_name: homarr + image: ghcr.io/homarr-labs/homarr:beta + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./homarr/appdata:/appdata + environment: + # Generate with: openssl rand -hex 32 + - SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY} + # Database configuration (SQLite default) + - DB_URL=/appdata/db/homarr.db + # Authentication settings + - AUTH_PROVIDERS=${AUTH_PROVIDERS:-credentials} + # Logging + - NODE_ENV=production + ports: + - '${HOMARR_PORT:-7575}:7575' + networks: + - dashboard-network + - npm-network # Connect to NPM network for reverse proxy + depends_on: + - dash + + #------------------------------------------------------------------# + # Dash. - System Monitoring # + #------------------------------------------------------------------# + dash: + container_name: dash + image: mauricenino/dashdot:latest + restart: unless-stopped + privileged: true + volumes: + - /:/mnt/host:ro + environment: + # Widget customization + - DASHDOT_ENABLE_CPU_TEMPS=true + - DASHDOT_ALWAYS_SHOW_PERCENTAGES=true + - DASHDOT_ENABLE_STORAGE_SPLIT_VIEW=true + - DASHDOT_PAGE_TITLE=System Overview + # Network speed test (every 4 hours) + - DASHDOT_SPEED_TEST_INTERVAL=${DASH_SPEED_TEST_INTERVAL:-240} + # Theme - dark to match lemonlink.eu + - DASHDOT_WIDGET_LIST=os,cpu,storage,ram,network + - DASHDOT_OS_LABEL_LIST=brand,os,arch,up_since + - DASHDOT_CPU_LABEL_LIST=brand,model,cores,threads,frequency + - DASHDOT_STORAGE_LABEL_LIST=brand,size,type + - DASHDOT_RAM_LABEL_LIST=brand,size,type,frequency + - DASHDOT_NETWORK_LABEL_LIST=type,speed_up,speed_down,interface_speed + ports: + - '${DASH_PORT:-3001}:3001' + networks: + - dashboard-network + - npm-network # Connect to NPM network for reverse proxy + + #------------------------------------------------------------------# + # Watchtower - Auto-update containers # + #------------------------------------------------------------------# + watchtower: + container_name: watchtower + image: containrrr/watchtower:latest + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - WATCHTOWER_CLEANUP=true + - WATCHTOWER_POLL_INTERVAL=${WATCHTOWER_INTERVAL:-86400} + - WATCHTOWER_INCLUDE_STOPPED=true + - WATCHTOWER_NOTIFICATIONS=${WATCHTOWER_NOTIFICATIONS:-} + command: --interval ${WATCHTOWER_INTERVAL:-86400} homarr dash + networks: + - dashboard-network + +networks: + dashboard-network: + driver: bridge + npm-network: + external: true # Created by NPM diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..9ea5bff --- /dev/null +++ b/update.sh @@ -0,0 +1,194 @@ +#!/bin/bash +#======================================================================# +# Homarr Update Script # +# Pulls latest changes from Gitea and restarts services # +#======================================================================# + +set -e + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +REPO_URL="https://gitea.lemonlink.eu/homelab/homarr-dashboard" + +print_header() { + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} Homarr Dashboard Update Script ${NC}" + echo -e "${BLUE}========================================${NC}" + echo "" +} + +print_success() { + echo -e "${GREEN}βœ… $1${NC}" +} + +print_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +print_error() { + echo -e "${RED}❌ $1${NC}" +} + +print_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +# Check if running in git repo +check_git_repo() { + if [ ! -d .git ]; then + print_error "Not a git repository!" + print_info "Please run this script from the homarr-dashboard directory" + exit 1 + fi +} + +# Backup current state +backup_data() { + print_info "Creating backup..." + BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)" + mkdir -p "$BACKUP_DIR" + + if [ -d "homarr/appdata" ]; then + cp -r homarr/appdata "$BACKUP_DIR/" 2>/dev/null || true + fi + + if [ -f ".env" ]; then + cp .env "$BACKUP_DIR/" 2>/dev/null || true + fi + + print_success "Backup created at $BACKUP_DIR" +} + +# Pull latest changes +pull_updates() { + print_info "Pulling latest changes from Gitea..." + + # Fetch latest changes + git fetch origin + + # Check if there are updates + LOCAL=$(git rev-parse HEAD) + REMOTE=$(git rev-parse origin/main 2>/dev/null || git rev-parse origin/master) + + if [ "$LOCAL" = "$REMOTE" ]; then + print_success "Already up to date!" + return 0 + fi + + # Stash local changes if any + if ! git diff-index --quiet HEAD --; then + print_warning "Local changes detected, stashing..." + git stash + fi + + # Pull updates + git pull origin main 2>/dev/null || git pull origin master + print_success "Updated to latest version" + + # Show changes + echo "" + print_info "Recent changes:" + git log --oneline -5 +} + +# Update Docker images +update_containers() { + echo "" + print_info "Pulling latest Docker images..." + docker compose pull + print_success "Docker images updated" +} + +# Restart services +restart_services() { + echo "" + print_info "Restarting services..." + docker compose up -d --remove-orphans + print_success "Services restarted" +} + +# Cleanup old images +cleanup() { + echo "" + print_info "Cleaning up old Docker images..." + docker image prune -f + print_success "Cleanup complete" +} + +# Check service status +check_status() { + echo "" + print_info "Service Status:" + echo "----------------------------------------" + docker compose ps + echo "----------------------------------------" + + # Check if services are healthy + if docker compose ps | grep -q "Up"; then + echo "" + print_success "All services are running!" + + # Get IP for access info + IP=$(hostname -I | awk '{print $1}') + echo "" + echo -e "${GREEN}Access your dashboard:${NC}" + echo -e " β€’ Homarr: http://$IP:7575" + echo -e " β€’ Dash.: http://$IP:3001" + else + echo "" + print_error "Some services are not running!" + print_info "Check logs with: docker compose logs" + fi +} + +# Main function +main() { + print_header + + # Check prerequisites + if ! command -v docker &> /dev/null; then + print_error "Docker not found!" + exit 1 + fi + + if ! command -v git &> /dev/null; then + print_error "Git not found!" + exit 1 + fi + + check_git_repo + + # Show current version + CURRENT_COMMIT=$(git rev-parse --short HEAD) + print_info "Current version: $CURRENT_COMMIT" + + # Confirm update + read -p "Proceed with update? (y/N): " -n 1 -r + echo "" + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + print_info "Update cancelled" + exit 0 + fi + + # Execute update steps + backup_data + pull_updates + update_containers + restart_services + cleanup + check_status + + echo "" + print_success "Update complete! πŸŽ‰" + echo "" + print_info "If you encounter issues, restore from backup:" + echo " cp -r backups/$(ls -t backups | head -1)/* ." +} + +# Run main function +main