Add configuration templates and getting started guide
Co-authored-by: kelinfoxy <67766943+kelinfoxy@users.noreply.github.com>
This commit is contained in:
196
config-templates/README.md
Normal file
196
config-templates/README.md
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
# Configuration Templates
|
||||||
|
|
||||||
|
This directory contains example configuration files for various services. These templates provide sensible defaults and are ready to use with minimal modifications.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. **Create your config directory** (if it doesn't exist):
|
||||||
|
```bash
|
||||||
|
mkdir -p config/service-name
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Copy the template** to your config directory:
|
||||||
|
```bash
|
||||||
|
cp config-templates/service-name/* config/service-name/
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Edit the configuration** as needed for your environment
|
||||||
|
|
||||||
|
4. **Start the service** using Docker Compose
|
||||||
|
|
||||||
|
## Available Templates
|
||||||
|
|
||||||
|
### Prometheus (`prometheus/prometheus.yml`)
|
||||||
|
Metrics collection and monitoring system configuration.
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Pre-configured to scrape Node Exporter and cAdvisor
|
||||||
|
- 15-second scrape interval
|
||||||
|
- Ready for additional service monitoring
|
||||||
|
|
||||||
|
**Setup:**
|
||||||
|
```bash
|
||||||
|
mkdir -p config/prometheus
|
||||||
|
cp config-templates/prometheus/prometheus.yml config/prometheus/
|
||||||
|
docker compose -f docker-compose/monitoring.yml up -d prometheus
|
||||||
|
```
|
||||||
|
|
||||||
|
### Loki (`loki/loki-config.yml`)
|
||||||
|
Log aggregation system configuration.
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Filesystem-based storage
|
||||||
|
- 30-day log retention
|
||||||
|
- Automatic log compaction
|
||||||
|
- Pre-configured for Promtail
|
||||||
|
|
||||||
|
**Setup:**
|
||||||
|
```bash
|
||||||
|
mkdir -p config/loki
|
||||||
|
cp config-templates/loki/loki-config.yml config/loki/
|
||||||
|
docker compose -f docker-compose/monitoring.yml up -d loki
|
||||||
|
```
|
||||||
|
|
||||||
|
### Promtail (`promtail/promtail-config.yml`)
|
||||||
|
Log shipper for Loki.
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Automatically ships Docker container logs
|
||||||
|
- Parses Docker JSON format
|
||||||
|
- Extracts container IDs and names
|
||||||
|
- Optional system log collection
|
||||||
|
|
||||||
|
**Setup:**
|
||||||
|
```bash
|
||||||
|
mkdir -p config/promtail
|
||||||
|
cp config-templates/promtail/promtail-config.yml config/promtail/
|
||||||
|
docker compose -f docker-compose/monitoring.yml up -d promtail
|
||||||
|
```
|
||||||
|
|
||||||
|
### Redis (`redis/redis.conf`)
|
||||||
|
In-memory data store configuration.
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Both AOF and RDB persistence enabled
|
||||||
|
- 256MB memory limit with LRU eviction
|
||||||
|
- Sensible defaults for homelab use
|
||||||
|
- Security options (password protection available)
|
||||||
|
|
||||||
|
**Setup:**
|
||||||
|
```bash
|
||||||
|
mkdir -p config/redis
|
||||||
|
cp config-templates/redis/redis.conf config/redis/
|
||||||
|
# Optional: Edit redis.conf to set a password
|
||||||
|
docker compose -f docker-compose/development.yml up -d redis
|
||||||
|
```
|
||||||
|
|
||||||
|
## Customization Tips
|
||||||
|
|
||||||
|
### Prometheus
|
||||||
|
- Add more scrape targets to monitor additional services
|
||||||
|
- Adjust `scrape_interval` based on your needs (lower = more frequent, more data)
|
||||||
|
- Configure alerting by uncommenting the alertmanager section
|
||||||
|
|
||||||
|
### Loki
|
||||||
|
- Adjust `retention_period` to keep logs longer or shorter
|
||||||
|
- Change storage from filesystem to S3 for better scalability
|
||||||
|
- Configure multiple tenants if needed
|
||||||
|
|
||||||
|
### Promtail
|
||||||
|
- Add more scrape configs for system logs, application logs, etc.
|
||||||
|
- Customize pipeline stages to extract more labels
|
||||||
|
- Filter logs based on patterns
|
||||||
|
|
||||||
|
### Redis
|
||||||
|
- Set `maxmemory` based on your available RAM
|
||||||
|
- Choose appropriate `maxmemory-policy` for your use case
|
||||||
|
- Enable password protection by uncommenting `requirepass`
|
||||||
|
|
||||||
|
## Service-Specific Notes
|
||||||
|
|
||||||
|
### Services That Don't Need Config Templates
|
||||||
|
|
||||||
|
Many services work perfectly with just environment variables and don't require separate config files:
|
||||||
|
|
||||||
|
- **Plex, Jellyfin**: Configure via web UI
|
||||||
|
- **Sonarr, Radarr, Prowlarr**: Configure via web UI
|
||||||
|
- **Portainer**: Configure via web UI
|
||||||
|
- **Grafana**: Can use provisioning or web UI
|
||||||
|
- **Most LinuxServer.io images**: Configured via environment variables
|
||||||
|
|
||||||
|
### Services That Benefit from Config Files
|
||||||
|
|
||||||
|
- **Prometheus**: Requires `prometheus.yml` for scrape configuration
|
||||||
|
- **Loki**: Requires config for storage and retention
|
||||||
|
- **Promtail**: Requires config for log sources
|
||||||
|
- **Redis**: Benefits from custom config for persistence and security
|
||||||
|
- **Nginx**: Needs config for proxy rules (use Nginx Proxy Manager UI instead)
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Version Control**: Keep your config templates in git
|
||||||
|
2. **Secrets**: Never commit passwords or API keys
|
||||||
|
3. **Comments**: Add comments explaining custom settings
|
||||||
|
4. **Backups**: Backup config directories regularly
|
||||||
|
5. **Testing**: Test config changes in a separate environment first
|
||||||
|
|
||||||
|
## Creating New Templates
|
||||||
|
|
||||||
|
When creating templates for other services:
|
||||||
|
|
||||||
|
1. Start with the official documentation
|
||||||
|
2. Use sensible defaults for homelab use
|
||||||
|
3. Add comments explaining important settings
|
||||||
|
4. Include examples for common customizations
|
||||||
|
5. Test the template before committing
|
||||||
|
|
||||||
|
## Getting Help
|
||||||
|
|
||||||
|
- Check the official documentation for each service
|
||||||
|
- Ask GitHub Copilot in VS Code for configuration help
|
||||||
|
- Review the [Docker Guidelines](../docs/docker-guidelines.md)
|
||||||
|
- Consult service-specific community forums
|
||||||
|
|
||||||
|
## Example: Full Monitoring Stack Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create all config directories
|
||||||
|
mkdir -p config/{prometheus,loki,promtail,grafana}
|
||||||
|
|
||||||
|
# Copy templates
|
||||||
|
cp config-templates/prometheus/prometheus.yml config/prometheus/
|
||||||
|
cp config-templates/loki/loki-config.yml config/loki/
|
||||||
|
cp config-templates/promtail/promtail-config.yml config/promtail/
|
||||||
|
|
||||||
|
# Start the monitoring stack
|
||||||
|
docker compose -f docker-compose/monitoring.yml up -d
|
||||||
|
|
||||||
|
# Access services
|
||||||
|
# Prometheus: http://server-ip:9090
|
||||||
|
# Grafana: http://server-ip:3000
|
||||||
|
# Loki: http://server-ip:3100
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Config file not found
|
||||||
|
Ensure you copied the template to the correct location referenced in the docker-compose file.
|
||||||
|
|
||||||
|
### Permission errors
|
||||||
|
Fix ownership:
|
||||||
|
```bash
|
||||||
|
sudo chown -R 1000:1000 config/service-name
|
||||||
|
```
|
||||||
|
|
||||||
|
### Syntax errors
|
||||||
|
Validate YAML files:
|
||||||
|
```bash
|
||||||
|
# For YAML files
|
||||||
|
python3 -c "import yaml; yaml.safe_load(open('config/service/config.yml'))"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service won't start
|
||||||
|
Check logs for configuration errors:
|
||||||
|
```bash
|
||||||
|
docker compose -f docker-compose/file.yml logs service-name
|
||||||
|
```
|
||||||
46
config-templates/loki/loki-config.yml
Normal file
46
config-templates/loki/loki-config.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# Loki Configuration Template
|
||||||
|
# Copy this file to ./config/loki/loki-config.yml
|
||||||
|
|
||||||
|
auth_enabled: false
|
||||||
|
|
||||||
|
server:
|
||||||
|
http_listen_port: 3100
|
||||||
|
grpc_listen_port: 9096
|
||||||
|
|
||||||
|
common:
|
||||||
|
path_prefix: /loki
|
||||||
|
storage:
|
||||||
|
filesystem:
|
||||||
|
chunks_directory: /loki/chunks
|
||||||
|
rules_directory: /loki/rules
|
||||||
|
replication_factor: 1
|
||||||
|
ring:
|
||||||
|
instance_addr: 127.0.0.1
|
||||||
|
kvstore:
|
||||||
|
store: inmemory
|
||||||
|
|
||||||
|
schema_config:
|
||||||
|
configs:
|
||||||
|
- from: 2020-10-24
|
||||||
|
store: boltdb-shipper
|
||||||
|
object_store: filesystem
|
||||||
|
schema: v11
|
||||||
|
index:
|
||||||
|
prefix: index_
|
||||||
|
period: 24h
|
||||||
|
|
||||||
|
ruler:
|
||||||
|
alertmanager_url: http://localhost:9093
|
||||||
|
|
||||||
|
# Retention configuration (delete logs older than 30 days)
|
||||||
|
limits_config:
|
||||||
|
retention_period: 720h # 30 days
|
||||||
|
|
||||||
|
# Compactor to delete old data
|
||||||
|
compactor:
|
||||||
|
working_directory: /loki/compactor
|
||||||
|
shared_store: filesystem
|
||||||
|
compaction_interval: 10m
|
||||||
|
retention_enabled: true
|
||||||
|
retention_delete_delay: 2h
|
||||||
|
retention_delete_worker_count: 150
|
||||||
49
config-templates/prometheus/prometheus.yml
Normal file
49
config-templates/prometheus/prometheus.yml
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# Prometheus Configuration Template
|
||||||
|
# Copy this file to ./config/prometheus/prometheus.yml
|
||||||
|
|
||||||
|
global:
|
||||||
|
scrape_interval: 15s
|
||||||
|
evaluation_interval: 15s
|
||||||
|
external_labels:
|
||||||
|
monitor: 'homelab'
|
||||||
|
|
||||||
|
# Alertmanager configuration (optional)
|
||||||
|
# alerting:
|
||||||
|
# alertmanagers:
|
||||||
|
# - static_configs:
|
||||||
|
# - targets:
|
||||||
|
# - alertmanager:9093
|
||||||
|
|
||||||
|
# Load rules once and periodically evaluate them
|
||||||
|
# rule_files:
|
||||||
|
# - "alerts/*.yml"
|
||||||
|
|
||||||
|
# Scrape configurations
|
||||||
|
scrape_configs:
|
||||||
|
# Prometheus itself
|
||||||
|
- job_name: 'prometheus'
|
||||||
|
static_configs:
|
||||||
|
- targets: ['localhost:9090']
|
||||||
|
|
||||||
|
# Node Exporter - System metrics
|
||||||
|
- job_name: 'node-exporter'
|
||||||
|
static_configs:
|
||||||
|
- targets: ['node-exporter:9100']
|
||||||
|
labels:
|
||||||
|
instance: 'homelab-server'
|
||||||
|
|
||||||
|
# cAdvisor - Container metrics
|
||||||
|
- job_name: 'cadvisor'
|
||||||
|
static_configs:
|
||||||
|
- targets: ['cadvisor:8080']
|
||||||
|
labels:
|
||||||
|
instance: 'homelab-server'
|
||||||
|
|
||||||
|
# Add your own services here
|
||||||
|
# Example: Monitor a service with /metrics endpoint
|
||||||
|
# - job_name: 'my-service'
|
||||||
|
# static_configs:
|
||||||
|
# - targets: ['my-service:8080']
|
||||||
|
# labels:
|
||||||
|
# instance: 'homelab-server'
|
||||||
|
# service: 'my-service'
|
||||||
53
config-templates/promtail/promtail-config.yml
Normal file
53
config-templates/promtail/promtail-config.yml
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# Promtail Configuration Template
|
||||||
|
# Copy this file to ./config/promtail/promtail-config.yml
|
||||||
|
|
||||||
|
server:
|
||||||
|
http_listen_port: 9080
|
||||||
|
grpc_listen_port: 0
|
||||||
|
|
||||||
|
positions:
|
||||||
|
filename: /tmp/positions.yaml
|
||||||
|
|
||||||
|
clients:
|
||||||
|
- url: http://loki:3100/loki/api/v1/push
|
||||||
|
|
||||||
|
scrape_configs:
|
||||||
|
# Docker container logs
|
||||||
|
- job_name: docker
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: docker
|
||||||
|
__path__: /var/lib/docker/containers/*/*-json.log
|
||||||
|
|
||||||
|
pipeline_stages:
|
||||||
|
# Parse Docker JSON logs
|
||||||
|
- json:
|
||||||
|
expressions:
|
||||||
|
output: log
|
||||||
|
stream: stream
|
||||||
|
attrs: attrs
|
||||||
|
|
||||||
|
# Extract container name from path
|
||||||
|
- regex:
|
||||||
|
expression: '/var/lib/docker/containers/(?P<container_id>[^/]+)/.*'
|
||||||
|
source: filename
|
||||||
|
|
||||||
|
# Add labels
|
||||||
|
- labels:
|
||||||
|
stream:
|
||||||
|
container_id:
|
||||||
|
|
||||||
|
# Output the log line
|
||||||
|
- output:
|
||||||
|
source: output
|
||||||
|
|
||||||
|
# System logs (optional)
|
||||||
|
# - job_name: system
|
||||||
|
# static_configs:
|
||||||
|
# - targets:
|
||||||
|
# - localhost
|
||||||
|
# labels:
|
||||||
|
# job: varlogs
|
||||||
|
# __path__: /var/log/*.log
|
||||||
42
config-templates/redis/redis.conf
Normal file
42
config-templates/redis/redis.conf
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# Redis Configuration Template
|
||||||
|
# Copy this file to ./config/redis/redis.conf
|
||||||
|
|
||||||
|
# Network
|
||||||
|
bind 0.0.0.0
|
||||||
|
protected-mode yes
|
||||||
|
port 6379
|
||||||
|
|
||||||
|
# General
|
||||||
|
daemonize no
|
||||||
|
supervised no
|
||||||
|
pidfile /var/run/redis_6379.pid
|
||||||
|
loglevel notice
|
||||||
|
logfile ""
|
||||||
|
|
||||||
|
# Persistence - AOF (Append Only File)
|
||||||
|
appendonly yes
|
||||||
|
appendfilename "appendonly.aof"
|
||||||
|
appendfsync everysec
|
||||||
|
no-appendfsync-on-rewrite no
|
||||||
|
auto-aof-rewrite-percentage 100
|
||||||
|
auto-aof-rewrite-min-size 64mb
|
||||||
|
|
||||||
|
# Persistence - RDB (Snapshotting)
|
||||||
|
save 900 1
|
||||||
|
save 300 10
|
||||||
|
save 60 10000
|
||||||
|
stop-writes-on-bgsave-error yes
|
||||||
|
rdbcompression yes
|
||||||
|
rdbchecksum yes
|
||||||
|
dbfilename dump.rdb
|
||||||
|
dir /data
|
||||||
|
|
||||||
|
# Memory Management
|
||||||
|
maxmemory 256mb
|
||||||
|
maxmemory-policy allkeys-lru
|
||||||
|
|
||||||
|
# Security
|
||||||
|
# requirepass yourpassword # Uncomment and set a strong password
|
||||||
|
|
||||||
|
# Limits
|
||||||
|
maxclients 10000
|
||||||
506
docs/getting-started.md
Normal file
506
docs/getting-started.md
Normal file
@@ -0,0 +1,506 @@
|
|||||||
|
# Getting Started Guide
|
||||||
|
|
||||||
|
This guide will walk you through setting up your AI-powered homelab from scratch.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
Before you begin, ensure you have:
|
||||||
|
|
||||||
|
- [ ] A Linux server (Ubuntu 22.04+ recommended)
|
||||||
|
- [ ] Docker Engine 24.0+ installed
|
||||||
|
- [ ] Docker Compose V2 installed
|
||||||
|
- [ ] Git installed
|
||||||
|
- [ ] At least 8GB RAM (16GB+ recommended)
|
||||||
|
- [ ] Sufficient disk space (100GB+ recommended)
|
||||||
|
- [ ] Static IP address for your server
|
||||||
|
- [ ] VS Code with GitHub Copilot extension (for AI assistance)
|
||||||
|
|
||||||
|
## Step 1: Verify Docker Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check Docker version
|
||||||
|
docker --version
|
||||||
|
# Should show: Docker version 24.0.0 or higher
|
||||||
|
|
||||||
|
# Check Docker Compose version
|
||||||
|
docker compose version
|
||||||
|
# Should show: Docker Compose version v2.x.x
|
||||||
|
|
||||||
|
# Test Docker works
|
||||||
|
docker run --rm hello-world
|
||||||
|
# Should download and run successfully
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 2: Clone the Repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Navigate to your home directory
|
||||||
|
cd ~
|
||||||
|
|
||||||
|
# Clone the repository
|
||||||
|
git clone https://github.com/kelinfoxy/AI-Homelab.git
|
||||||
|
|
||||||
|
# Enter the directory
|
||||||
|
cd AI-Homelab
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 3: Configure Environment Variables
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Copy the example environment file
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
|
# Get your user and group IDs
|
||||||
|
id -u # This is your PUID
|
||||||
|
id -g # This is your PGID
|
||||||
|
|
||||||
|
# Edit the .env file
|
||||||
|
nano .env
|
||||||
|
```
|
||||||
|
|
||||||
|
**Update these values in `.env`:**
|
||||||
|
```bash
|
||||||
|
# Your user/group IDs
|
||||||
|
PUID=1000 # Replace with your user ID
|
||||||
|
PGID=1000 # Replace with your group ID
|
||||||
|
|
||||||
|
# Your timezone (find yours: timedatectl list-timezones)
|
||||||
|
TZ=America/New_York
|
||||||
|
|
||||||
|
# Your server's IP address
|
||||||
|
SERVER_IP=192.168.1.100 # Replace with your actual IP
|
||||||
|
|
||||||
|
# Directory paths
|
||||||
|
USERDIR=/home/yourusername/homelab # Update username
|
||||||
|
MEDIADIR=/mnt/media # Update if different
|
||||||
|
DOWNLOADDIR=/mnt/downloads # Update if different
|
||||||
|
|
||||||
|
# Set secure passwords for services
|
||||||
|
GRAFANA_ADMIN_PASSWORD=your-secure-password-here
|
||||||
|
CODE_SERVER_PASSWORD=your-secure-password-here
|
||||||
|
POSTGRES_PASSWORD=your-secure-password-here
|
||||||
|
PGADMIN_PASSWORD=your-secure-password-here
|
||||||
|
JUPYTER_TOKEN=your-secure-token-here
|
||||||
|
PIHOLE_PASSWORD=your-secure-password-here
|
||||||
|
```
|
||||||
|
|
||||||
|
**Save and exit** (Ctrl+X, Y, Enter in nano)
|
||||||
|
|
||||||
|
## Step 4: Create Docker Networks
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create the main homelab network
|
||||||
|
docker network create homelab-network
|
||||||
|
|
||||||
|
# Create additional networks for better security
|
||||||
|
docker network create media-network
|
||||||
|
docker network create monitoring-network
|
||||||
|
docker network create database-network
|
||||||
|
|
||||||
|
# Verify networks were created
|
||||||
|
docker network ls
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 5: Create Configuration Directories
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create the main config directory
|
||||||
|
mkdir -p config
|
||||||
|
|
||||||
|
# Create config directories for services you plan to use
|
||||||
|
mkdir -p config/{nginx-proxy-manager,pihole,portainer}
|
||||||
|
mkdir -p config/{plex,sonarr,radarr,prowlarr,qbittorrent,jellyfin}
|
||||||
|
mkdir -p config/{prometheus,grafana,loki,promtail}
|
||||||
|
mkdir -p config/{code-server,postgres,redis}
|
||||||
|
|
||||||
|
# Set proper permissions
|
||||||
|
sudo chown -R $(id -u):$(id -g) config/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 6: Copy Configuration Templates (Optional)
|
||||||
|
|
||||||
|
For services that need config files:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Prometheus
|
||||||
|
mkdir -p config/prometheus
|
||||||
|
cp config-templates/prometheus/prometheus.yml config/prometheus/
|
||||||
|
|
||||||
|
# Loki
|
||||||
|
mkdir -p config/loki
|
||||||
|
cp config-templates/loki/loki-config.yml config/loki/
|
||||||
|
|
||||||
|
# Promtail
|
||||||
|
mkdir -p config/promtail
|
||||||
|
cp config-templates/promtail/promtail-config.yml config/promtail/
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
mkdir -p config/redis
|
||||||
|
cp config-templates/redis/redis.conf config/redis/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 7: Start Your First Service (Portainer)
|
||||||
|
|
||||||
|
Portainer provides a web UI for managing Docker containers. It's a great first service to deploy.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start Portainer
|
||||||
|
docker compose -f docker-compose/infrastructure.yml up -d portainer
|
||||||
|
|
||||||
|
# Check if it's running
|
||||||
|
docker compose -f docker-compose/infrastructure.yml ps
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
docker compose -f docker-compose/infrastructure.yml logs -f portainer
|
||||||
|
```
|
||||||
|
|
||||||
|
**Access Portainer:**
|
||||||
|
1. Open your browser
|
||||||
|
2. Navigate to `http://YOUR_SERVER_IP:9000`
|
||||||
|
3. Create an admin account on first login
|
||||||
|
4. Select "Get Started" and choose local Docker environment
|
||||||
|
|
||||||
|
## Step 8: Deploy Infrastructure Services
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start all infrastructure services
|
||||||
|
docker compose -f docker-compose/infrastructure.yml up -d
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
docker compose -f docker-compose/infrastructure.yml ps
|
||||||
|
|
||||||
|
# Services now running:
|
||||||
|
# - Nginx Proxy Manager: http://YOUR_SERVER_IP:81
|
||||||
|
# - Pi-hole: http://YOUR_SERVER_IP:8080/admin
|
||||||
|
# - Portainer: http://YOUR_SERVER_IP:9000
|
||||||
|
# - Watchtower: (runs in background, no UI)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure Nginx Proxy Manager (Optional)
|
||||||
|
|
||||||
|
1. Access: `http://YOUR_SERVER_IP:81`
|
||||||
|
2. Login with default credentials:
|
||||||
|
- Email: `admin@example.com`
|
||||||
|
- Password: `changeme`
|
||||||
|
3. Change password immediately
|
||||||
|
4. Add proxy hosts for your services
|
||||||
|
|
||||||
|
### Configure Pi-hole (Optional)
|
||||||
|
|
||||||
|
1. Access: `http://YOUR_SERVER_IP:8080/admin`
|
||||||
|
2. Login with password from `.env` (PIHOLE_PASSWORD)
|
||||||
|
3. Configure DNS settings
|
||||||
|
4. Update your router to use Pi-hole as DNS server
|
||||||
|
|
||||||
|
## Step 9: Deploy Media Services (Optional)
|
||||||
|
|
||||||
|
If you want a media server setup:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start media services
|
||||||
|
docker compose -f docker-compose/media.yml up -d
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
docker compose -f docker-compose/media.yml ps
|
||||||
|
|
||||||
|
# Services now running:
|
||||||
|
# - Plex: http://YOUR_SERVER_IP:32400/web
|
||||||
|
# - Jellyfin: http://YOUR_SERVER_IP:8096
|
||||||
|
# - Sonarr: http://YOUR_SERVER_IP:8989
|
||||||
|
# - Radarr: http://YOUR_SERVER_IP:7878
|
||||||
|
# - Prowlarr: http://YOUR_SERVER_IP:9696
|
||||||
|
# - qBittorrent: http://YOUR_SERVER_IP:8081
|
||||||
|
```
|
||||||
|
|
||||||
|
### Initial Media Service Setup
|
||||||
|
|
||||||
|
**Plex:**
|
||||||
|
1. Access: `http://YOUR_SERVER_IP:32400/web`
|
||||||
|
2. Sign in with your Plex account
|
||||||
|
3. Add your media libraries
|
||||||
|
|
||||||
|
**Sonarr/Radarr:**
|
||||||
|
1. Access the web UI
|
||||||
|
2. Go to Settings → Profiles → Quality
|
||||||
|
3. Configure your quality preferences
|
||||||
|
4. Add Prowlarr as an indexer
|
||||||
|
5. Add qBittorrent as a download client
|
||||||
|
|
||||||
|
## Step 10: Deploy Monitoring Services (Optional)
|
||||||
|
|
||||||
|
For system and service monitoring:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start monitoring services
|
||||||
|
docker compose -f docker-compose/monitoring.yml up -d
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
docker compose -f docker-compose/monitoring.yml ps
|
||||||
|
|
||||||
|
# Services now running:
|
||||||
|
# - Prometheus: http://YOUR_SERVER_IP:9090
|
||||||
|
# - Grafana: http://YOUR_SERVER_IP:3000
|
||||||
|
# - Node Exporter: http://YOUR_SERVER_IP:9100
|
||||||
|
# - cAdvisor: http://YOUR_SERVER_IP:8082
|
||||||
|
# - Uptime Kuma: http://YOUR_SERVER_IP:3001
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure Grafana
|
||||||
|
|
||||||
|
1. Access: `http://YOUR_SERVER_IP:3000`
|
||||||
|
2. Login with credentials from `.env`:
|
||||||
|
- Username: `admin`
|
||||||
|
- Password: `GRAFANA_ADMIN_PASSWORD` from .env
|
||||||
|
3. Add Prometheus as a data source:
|
||||||
|
- URL: `http://prometheus:9090`
|
||||||
|
4. Import dashboards:
|
||||||
|
- Dashboard ID 1860 for Node Exporter
|
||||||
|
- Dashboard ID 893 for Docker metrics
|
||||||
|
|
||||||
|
### Configure Uptime Kuma
|
||||||
|
|
||||||
|
1. Access: `http://YOUR_SERVER_IP:3001`
|
||||||
|
2. Create an account on first login
|
||||||
|
3. Add monitors for your services
|
||||||
|
|
||||||
|
## Step 11: Deploy Development Services (Optional)
|
||||||
|
|
||||||
|
If you need development tools:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start development services
|
||||||
|
docker compose -f docker-compose/development.yml up -d
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
docker compose -f docker-compose/development.yml ps
|
||||||
|
|
||||||
|
# Services now running:
|
||||||
|
# - Code Server: http://YOUR_SERVER_IP:8443
|
||||||
|
# - PostgreSQL: localhost:5432
|
||||||
|
# - Redis: localhost:6379
|
||||||
|
# - pgAdmin: http://YOUR_SERVER_IP:5050
|
||||||
|
# - Jupyter Lab: http://YOUR_SERVER_IP:8888
|
||||||
|
# - Node-RED: http://YOUR_SERVER_IP:1880
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 12: Set Up VS Code with GitHub Copilot
|
||||||
|
|
||||||
|
1. **Install VS Code** on your local machine (if not already installed)
|
||||||
|
|
||||||
|
2. **Install GitHub Copilot extension:**
|
||||||
|
- Open VS Code
|
||||||
|
- Go to Extensions (Ctrl+Shift+X)
|
||||||
|
- Search for "GitHub Copilot"
|
||||||
|
- Click Install
|
||||||
|
- Sign in with your GitHub account
|
||||||
|
|
||||||
|
3. **Clone your repository in VS Code:**
|
||||||
|
```bash
|
||||||
|
# On your local machine
|
||||||
|
git clone https://github.com/kelinfoxy/AI-Homelab.git
|
||||||
|
cd AI-Homelab
|
||||||
|
code .
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Start using AI assistance:**
|
||||||
|
- Open Copilot Chat (Ctrl+Shift+I or click the chat icon)
|
||||||
|
- The AI assistant automatically follows the guidelines in `.github/copilot-instructions.md`
|
||||||
|
- Ask questions like:
|
||||||
|
- "Help me add Home Assistant to my homelab"
|
||||||
|
- "Create a backup script for my Docker volumes"
|
||||||
|
- "How do I configure GPU support for Plex?"
|
||||||
|
|
||||||
|
## Step 13: Verify Everything is Running
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check all running containers
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# Check container health
|
||||||
|
docker ps --format "table {{.Names}}\t{{.Status}}"
|
||||||
|
|
||||||
|
# View resource usage
|
||||||
|
docker stats --no-stream
|
||||||
|
|
||||||
|
# Check disk usage
|
||||||
|
docker system df
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 14: Set Up Backups
|
||||||
|
|
||||||
|
Create a backup script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a backup directory
|
||||||
|
mkdir -p ~/backups
|
||||||
|
|
||||||
|
# Create a simple backup script
|
||||||
|
cat > ~/backup-homelab.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
BACKUP_DIR=~/backups
|
||||||
|
DATE=$(date +%Y%m%d)
|
||||||
|
|
||||||
|
# Backup config directories
|
||||||
|
tar czf $BACKUP_DIR/config-$DATE.tar.gz ~/AI-Homelab/config/
|
||||||
|
|
||||||
|
# Backup .env file
|
||||||
|
cp ~/AI-Homelab/.env $BACKUP_DIR/.env-$DATE
|
||||||
|
|
||||||
|
# Backup Docker volumes (example for Portainer)
|
||||||
|
docker run --rm \
|
||||||
|
-v portainer-data:/data \
|
||||||
|
-v $BACKUP_DIR:/backup \
|
||||||
|
busybox tar czf /backup/portainer-data-$DATE.tar.gz /data
|
||||||
|
|
||||||
|
echo "Backup completed: $DATE"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Make it executable
|
||||||
|
chmod +x ~/backup-homelab.sh
|
||||||
|
|
||||||
|
# Test the backup
|
||||||
|
~/backup-homelab.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Set up a cron job for automated backups:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Open crontab
|
||||||
|
crontab -e
|
||||||
|
|
||||||
|
# Add this line to run backup daily at 2 AM
|
||||||
|
0 2 * * * /home/yourusername/backup-homelab.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 15: Configure Firewall (Optional but Recommended)
|
||||||
|
|
||||||
|
If using UFW:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Allow SSH (if not already allowed)
|
||||||
|
sudo ufw allow 22/tcp
|
||||||
|
|
||||||
|
# Allow web traffic (if exposing services to internet)
|
||||||
|
sudo ufw allow 80/tcp
|
||||||
|
sudo ufw allow 443/tcp
|
||||||
|
|
||||||
|
# Allow specific services from local network only
|
||||||
|
# Replace 192.168.1.0/24 with your network
|
||||||
|
sudo ufw allow from 192.168.1.0/24 to any port 9000 proto tcp # Portainer
|
||||||
|
sudo ufw allow from 192.168.1.0/24 to any port 81 proto tcp # Nginx Proxy Manager
|
||||||
|
sudo ufw allow from 192.168.1.0/24 to any port 3000 proto tcp # Grafana
|
||||||
|
|
||||||
|
# Enable firewall
|
||||||
|
sudo ufw enable
|
||||||
|
```
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
Now that your homelab is running:
|
||||||
|
|
||||||
|
1. **Explore Services:**
|
||||||
|
- Access each service's web UI
|
||||||
|
- Configure settings as needed
|
||||||
|
- Set up integrations between services
|
||||||
|
|
||||||
|
2. **Add More Services:**
|
||||||
|
- Ask GitHub Copilot for help adding new services
|
||||||
|
- Follow the patterns in existing compose files
|
||||||
|
- Check [awesome-selfhosted](https://github.com/awesome-selfhosted/awesome-selfhosted) for ideas
|
||||||
|
|
||||||
|
3. **Optimize:**
|
||||||
|
- Review logs for errors
|
||||||
|
- Adjust resource limits
|
||||||
|
- Set up proper monitoring and alerts
|
||||||
|
|
||||||
|
4. **Secure:**
|
||||||
|
- Change all default passwords
|
||||||
|
- Set up SSL certificates (use Nginx Proxy Manager)
|
||||||
|
- Enable 2FA where available
|
||||||
|
- Keep services updated
|
||||||
|
|
||||||
|
5. **Learn:**
|
||||||
|
- Read the [Docker Guidelines](docker-guidelines.md)
|
||||||
|
- Experiment with new services
|
||||||
|
- Use AI assistance to understand and modify configurations
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Can't access services
|
||||||
|
|
||||||
|
1. **Check if service is running:**
|
||||||
|
```bash
|
||||||
|
docker ps
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check service logs:**
|
||||||
|
```bash
|
||||||
|
docker compose -f docker-compose/file.yml logs service-name
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Verify network connectivity:**
|
||||||
|
```bash
|
||||||
|
ping YOUR_SERVER_IP
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Check firewall:**
|
||||||
|
```bash
|
||||||
|
sudo ufw status
|
||||||
|
```
|
||||||
|
|
||||||
|
### Permission errors
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Fix config directory permissions
|
||||||
|
sudo chown -R $(id -u):$(id -g) config/
|
||||||
|
|
||||||
|
# Verify PUID/PGID in .env match your user
|
||||||
|
id -u # Should match PUID in .env
|
||||||
|
id -g # Should match PGID in .env
|
||||||
|
```
|
||||||
|
|
||||||
|
### Port already in use
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find what's using the port
|
||||||
|
sudo netstat -tlnp | grep PORT_NUMBER
|
||||||
|
|
||||||
|
# Stop the conflicting service or change the port in docker-compose
|
||||||
|
```
|
||||||
|
|
||||||
|
### Out of disk space
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check disk usage
|
||||||
|
df -h
|
||||||
|
|
||||||
|
# Clean up Docker resources
|
||||||
|
docker system prune -a
|
||||||
|
|
||||||
|
# Remove old logs
|
||||||
|
docker compose logs --tail=0 service-name
|
||||||
|
```
|
||||||
|
|
||||||
|
## Getting Help
|
||||||
|
|
||||||
|
- **Documentation:** Check the `docs/` directory for comprehensive guides
|
||||||
|
- **AI Assistance:** Use GitHub Copilot in VS Code for real-time help
|
||||||
|
- **Community:** Search for service-specific help in respective communities
|
||||||
|
- **Issues:** Open an issue on GitHub for problems with this repository
|
||||||
|
|
||||||
|
## Success Checklist
|
||||||
|
|
||||||
|
- [ ] Docker and Docker Compose installed
|
||||||
|
- [ ] Repository cloned
|
||||||
|
- [ ] `.env` file configured
|
||||||
|
- [ ] Networks created
|
||||||
|
- [ ] Config directories created
|
||||||
|
- [ ] Portainer running and accessible
|
||||||
|
- [ ] Infrastructure services deployed
|
||||||
|
- [ ] At least one service category deployed (media/monitoring/dev)
|
||||||
|
- [ ] VS Code with GitHub Copilot set up
|
||||||
|
- [ ] Backup strategy in place
|
||||||
|
- [ ] Firewall configured (if applicable)
|
||||||
|
- [ ] All services accessible and working
|
||||||
|
|
||||||
|
Congratulations! Your AI-powered homelab is now running! 🎉
|
||||||
Reference in New Issue
Block a user