Files
homelab-optimized/docs/admin/DEPLOYMENT_WORKFLOW.md
Gitea Mirror Bot 1f453f302a
Some checks failed
Documentation / Deploy to GitHub Pages (push) Has been cancelled
Documentation / Build Docusaurus (push) Has been cancelled
Sanitized mirror from private repository - 2026-04-05 10:10:45 UTC
2026-04-05 10:10:45 +00:00

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.*