513 lines
12 KiB
Markdown
513 lines
12 KiB
Markdown
# 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
|
|
# Note: Replace 'kelinfoxy' with your username if you forked this 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
|
|
# Note: Replace 'kelinfoxy' with your username if you forked this repository
|
|
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 (removes unused images, containers, networks)
|
|
docker system prune -a
|
|
|
|
# To manage log size, configure log rotation in compose files:
|
|
# logging:
|
|
# driver: "json-file"
|
|
# options:
|
|
# max-size: "10m"
|
|
# max-file: "3"
|
|
```
|
|
|
|
## 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! 🎉
|