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:
Roberth Rajala 2026-02-03 10:45:23 +01:00
commit 3a503cddf9
12 changed files with 2501 additions and 0 deletions

92
.env.example Normal file
View File

@ -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

42
.gitignore vendored Normal file
View File

@ -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/

463
DEPLOYMENT.md Normal file
View File

@ -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

328
GITEA_SETUP.md Normal file
View File

@ -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
```

160
README.md Normal file
View File

@ -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!

494
config/apps.json Normal file
View File

@ -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"
}
]
}
}
}

241
config/board-layouts.md Normal file
View File

@ -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] │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```

95
config/homarr-themes.md Normal file
View File

@ -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;
}
```

194
config/rss-feeds.json Normal file
View File

@ -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
}
}
}

110
deploy.sh Normal file
View File

@ -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}"

88
docker-compose.yml Normal file
View File

@ -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

194
update.sh Normal file
View File

@ -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