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
This commit is contained in:
commit
3a503cddf9
|
|
@ -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
|
||||||
|
|
@ -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/
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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 <commit-hash>
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## ✨ 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!
|
||||||
|
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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] │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ └───────────────────────────────────────────────────────────┘ │
|
||||||
|
│ │
|
||||||
|
└─────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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}"
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue