298 lines
7.5 KiB
Markdown
298 lines
7.5 KiB
Markdown
# Homelab Deployment Workflow Guide
|
|
|
|
This guide walks you through deploying services in your homelab using Gitea, Portainer, and the new development tools.
|
|
|
|
## 🎯 Overview
|
|
|
|
Your homelab uses a **GitOps workflow** where:
|
|
1. **Gitea** stores your Docker Compose files
|
|
2. **Portainer** automatically deploys from Gitea repositories
|
|
3. **Development tools** ensure quality before deployment
|
|
|
|
## 📋 Prerequisites
|
|
|
|
### Required Access
|
|
- [ ] **Gitea access** - Your Git repository at `git.vish.gg`
|
|
- [ ] **Portainer access** - Web UI for container management
|
|
- [ ] **SSH access** - To your homelab servers (optional but recommended)
|
|
|
|
### Required Tools
|
|
- [ ] **Git client** - For repository operations
|
|
- [ ] **Text editor** - VS Code recommended (supports DevContainer)
|
|
- [ ] **Docker** (optional) - For local testing
|
|
|
|
## 🚀 Quick Start: Deploy a New Service
|
|
|
|
### Step 1: Set Up Your Development Environment
|
|
|
|
#### Option A: Using VS Code DevContainer (Recommended)
|
|
```bash
|
|
# Clone the repository
|
|
git clone https://git.vish.gg/Vish/homelab.git
|
|
cd homelab
|
|
|
|
# Open in VS Code
|
|
code .
|
|
|
|
# VS Code will prompt to "Reopen in Container" - click Yes
|
|
# This gives you a pre-configured environment with all tools
|
|
```
|
|
|
|
#### Option B: Manual Setup
|
|
```bash
|
|
# Clone the repository
|
|
git clone https://git.vish.gg/Vish/homelab.git
|
|
cd homelab
|
|
|
|
# Install development tools (if needed)
|
|
# Most tools are available via Docker or pre-installed
|
|
|
|
# Set up Git hooks (optional)
|
|
pre-commit install
|
|
|
|
# Set up environment
|
|
cp .env.example .env
|
|
# Edit .env with your specific values
|
|
```
|
|
|
|
### Step 2: Create Your Service Configuration
|
|
|
|
1. **Choose the right location** for your service:
|
|
```
|
|
hosts/
|
|
├── synology/atlantis/ # Main Synology NAS
|
|
├── synology/calypso/ # Secondary Synology NAS
|
|
├── vms/homelab-vm/ # Primary VM
|
|
├── physical/concord-nuc/ # Physical NUC server
|
|
└── edge/rpi5-vish/ # Raspberry Pi edge device
|
|
```
|
|
|
|
2. **Create your Docker Compose file**:
|
|
```bash
|
|
# Example: Adding a new service to the main NAS
|
|
touch hosts/synology/atlantis/my-new-service.yml
|
|
```
|
|
|
|
3. **Write your Docker Compose configuration**:
|
|
```yaml
|
|
# hosts/synology/atlantis/my-new-service.yml
|
|
version: '3.8'
|
|
|
|
services:
|
|
my-service:
|
|
image: my-service:latest
|
|
container_name: my-service
|
|
restart: unless-stopped
|
|
ports:
|
|
- "8080:8080"
|
|
volumes:
|
|
- /volume1/docker/my-service:/data
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=America/New_York
|
|
networks:
|
|
- homelab
|
|
|
|
networks:
|
|
homelab:
|
|
external: true
|
|
```
|
|
|
|
### Step 3: Validate Your Configuration
|
|
|
|
The new development tools will automatically check your work:
|
|
|
|
```bash
|
|
# Manual validation (optional)
|
|
./scripts/validate-compose.sh hosts/synology/atlantis/my-new-service.yml
|
|
|
|
# Check YAML syntax
|
|
yamllint hosts/synology/atlantis/my-new-service.yml
|
|
|
|
# The pre-commit hooks will run these automatically when you commit
|
|
```
|
|
|
|
### Step 4: Commit and Push
|
|
|
|
```bash
|
|
# Stage your changes
|
|
git add hosts/synology/atlantis/my-new-service.yml
|
|
|
|
# Commit (pre-commit hooks run automatically)
|
|
git commit -m "feat: Add my-new-service deployment
|
|
|
|
- Add Docker Compose configuration for my-service
|
|
- Configured for Atlantis NAS deployment
|
|
- Includes proper networking and volume mounts"
|
|
|
|
# Push to Gitea
|
|
git push origin main
|
|
```
|
|
|
|
### Step 5: Deploy via Portainer
|
|
|
|
1. **Access Portainer** (usually at `https://portainer.yourdomain.com`)
|
|
|
|
2. **Navigate to Stacks**:
|
|
- Go to "Stacks" in the left sidebar
|
|
- Click "Add stack"
|
|
|
|
3. **Configure Git deployment**:
|
|
- **Name**: `my-new-service`
|
|
- **Repository URL**: `https://git.vish.gg/Vish/homelab`
|
|
- **Repository reference**: `refs/heads/main`
|
|
- **Compose path**: `hosts/synology/atlantis/my-new-service.yml`
|
|
- **Automatic updates**: Enable if desired
|
|
|
|
4. **Deploy**:
|
|
- Click "Deploy the stack"
|
|
- Monitor the deployment logs
|
|
|
|
## 🔧 Advanced Workflows
|
|
|
|
### Local Testing Before Deployment
|
|
|
|
```bash
|
|
# Test your compose file locally
|
|
cd hosts/synology/atlantis/
|
|
docker compose -f my-new-service.yml config # Validate syntax
|
|
docker compose -f my-new-service.yml up -d # Test deployment
|
|
docker compose -f my-new-service.yml down # Clean up
|
|
```
|
|
|
|
### Using Environment Variables
|
|
|
|
1. **Create environment file**:
|
|
```bash
|
|
# hosts/synology/atlantis/my-service.env
|
|
MYSQL_ROOT_PASSWORD="REDACTED_PASSWORD"
|
|
MYSQL_DATABASE=myapp
|
|
MYSQL_USER=myuser
|
|
MYSQL_PASSWORD="REDACTED_PASSWORD"
|
|
```
|
|
|
|
2. **Reference in compose file**:
|
|
```yaml
|
|
services:
|
|
my-service:
|
|
env_file:
|
|
- my-service.env
|
|
```
|
|
|
|
3. **Add to .gitignore** (for secrets):
|
|
```bash
|
|
echo "hosts/synology/atlantis/my-service.env" >> .gitignore
|
|
```
|
|
|
|
### Multi-Host Deployments
|
|
|
|
For services that span multiple hosts:
|
|
|
|
```bash
|
|
# Create configurations for each host
|
|
hosts/synology/atlantis/database.yml # Database on NAS
|
|
hosts/vms/homelab-vm/app-frontend.yml # Frontend on VM
|
|
hosts/physical/concord-nuc/app-api.yml # API on NUC
|
|
```
|
|
|
|
## 🛠️ Troubleshooting
|
|
|
|
### Pre-commit Hooks Failing
|
|
|
|
```bash
|
|
# See what failed
|
|
git commit -m "my changes" # Will show errors
|
|
|
|
# Fix issues and try again
|
|
git add .
|
|
git commit -m "my changes"
|
|
|
|
# Skip hooks if needed (not recommended)
|
|
git commit -m "my changes" --no-verify
|
|
```
|
|
|
|
### Portainer Deployment Issues
|
|
|
|
1. **Check Portainer logs**:
|
|
- Go to Stacks → Your Stack → Logs
|
|
|
|
2. **Verify file paths**:
|
|
- Ensure the compose path in Portainer matches your file location
|
|
|
|
3. **Check Git access**:
|
|
- Verify Portainer can access your Gitea repository
|
|
|
|
### Docker Compose Validation Errors
|
|
|
|
```bash
|
|
# Get detailed error information
|
|
docker compose -f your-file.yml config
|
|
|
|
# Common issues:
|
|
# - Indentation errors (use spaces, not tabs)
|
|
# - Missing quotes around special characters
|
|
# - Invalid port mappings
|
|
# - Non-existent volume paths
|
|
```
|
|
|
|
## 📚 Best Practices
|
|
|
|
### File Organization
|
|
- **Group related services** in the same directory
|
|
- **Use descriptive filenames** (`service-name.yml`)
|
|
- **Include documentation** in comments
|
|
|
|
### Security
|
|
- **Never commit secrets** to Git
|
|
- **Use environment files** for sensitive data
|
|
- **Set proper file permissions** on secrets
|
|
|
|
### Networking
|
|
- **Use the `homelab` network** for inter-service communication
|
|
- **Document port mappings** in comments
|
|
- **Avoid port conflicts** across services
|
|
|
|
### Volumes
|
|
- **Use consistent paths** (`/volume1/docker/service-name`)
|
|
- **Set proper ownership** (PUID/PGID)
|
|
- **Document data locations** for backups
|
|
|
|
## 🔗 Quick Reference
|
|
|
|
### Common Commands
|
|
```bash
|
|
# Validate all compose files
|
|
./scripts/validate-compose.sh
|
|
|
|
# Check specific file
|
|
./scripts/validate-compose.sh hosts/synology/atlantis/service.yml
|
|
|
|
# Run pre-commit checks manually
|
|
pre-commit run --all-files
|
|
|
|
# Update pre-commit hooks
|
|
pre-commit autoupdate
|
|
```
|
|
|
|
### File Locations
|
|
- **Service configs**: `hosts/{host-type}/{host-name}/service.yml`
|
|
- **Documentation**: `docs/`
|
|
- **Scripts**: `scripts/`
|
|
- **Development tools**: `.devcontainer/`, `.pre-commit-config.yaml`, etc.
|
|
|
|
### Portainer Stack Naming
|
|
- Use descriptive names: `atlantis-media-stack`, `homelab-monitoring`
|
|
- Include host prefix for clarity
|
|
- Keep names consistent with file names
|
|
|
|
## 🆘 Getting Help
|
|
|
|
1. **Check existing services** for examples
|
|
2. **Review validation errors** carefully
|
|
3. **Test locally** before pushing
|
|
4. **Use the development environment** for consistent tooling
|
|
|
|
---
|
|
|
|
*This workflow ensures reliable, tested deployments while maintaining the flexibility of your GitOps setup.* |