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